2024天梯赛L3-1https://pintia.cn/problem-sets/994805046380707840/exam/problems/1781658570803388428?type=7&page=1
题意:网格图上有障碍物,空地,给定若干起点,和一个终点,求唯一的最短路。也就是存在大于等于两个起点到终点距离相同的时候,这些起点无法贡献答案。
Solution:考虑直接从终点开始bfs,得到所有答案,最后统计起点即可更新答案。
实现细节:首先这个题目给的坐标是和以往反过来的,需要我们仔细读题和看样例。其次我们在统计答案的时候,直接维护值域的哈希表,不应该维护pair坐标的哈希表,不然肯定不会出现重复。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| 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}; } } 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; q.push(tmp); } }
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; 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; } }
|