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;
   }
}