网格图上问题
title: 网格图上问题
categories:
- ICPC
tags:
- null
abbrlink: d8850d48
date: 2024-12-15 00:00:00
2024天梯赛L3-1https://pintia.cn/problem-sets/994805046380707840/exam/problems/1781658570803388428?type=7&page=1
题意:网格图上有障碍物,空地,给定若干起点,和一个终点,求唯一的最短路。也就是存在大于等于两个起点到终点距离相同的时候,这些起点无法贡献答案。
Solution:考虑直接从终点开始bfs,得到所有答案,最后统计起点即可更新答案。
实现细节:首先这个题目给的坐标是和以往反过来的,需要我们仔细读题和看样例。其次我们在统计答案的时候,直接维护值域的哈希表,不应该维护pair坐标的哈希表,不然肯定不会出现重复。
int n, m;
int a[N][N];
map<pii,int>mp;
int dx[5]={1,0,0,-1};
int dy[5]={0,-1,1,0};
void solve(){
cin>>n>>m;
pii rt;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
if(a[i][j]==2)rt={i,j};
}
}
//cerr<<rt.fs<<" "<<rt.sec<<endl;
queue<pii>q;
q.push(rt);mp[rt]=0;
while(q.size()){
auto u=q.front();q.pop();
for(int i=0;i<4;i++){
int tx=u.fs+dx[i],ty=u.sec+dy[i];
if(tx<1||tx>n||ty<1||ty>m)continue;
if(mp.count({tx,ty}))continue;
if(a[tx][ty]!=1)continue;
pii tmp={tx,ty};
mp[tmp]=mp[u]+1;
// cerr<<u.fs<<" "<<u.sec<<" "<<mp[u]<<endl;
// cerr<<tmp.fs<<" "<<tmp.sec<<" "<<mp[tmp]<<endl;
// cerr<<"****************"<<endl;
q.push(tmp);
}
}
// for(auto[x,y]:mp)cerr<<x.fs<<" "<<x.sec<<" "<<y<<endl;
int k;cin>>k;
map<int,int>ans1;
map<int,int>id;
for(int i=1;i<=k;i++){
int y,x;cin>>y>>x;
pii tmp={x,y};
if(mp.count(tmp)==0)continue;
//cerr<<x<<" "<<y<<" "<<mp[tmp]<<endl;
ans1[mp[tmp]]++;
id[mp[tmp]]=i;
}
int ansid=0,res=inf;
for(auto [x,y]:ans1){
if(y>=2)continue;
else {
if(res>x){
res=x;
ansid=id[x];
}
}
}
if(res==inf)cout<<"No winner.";
else {
cout<<ansid<<" "<<res;
}
}
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 爱飞鱼的blog!