坐标反转的题一定要注意坑,统一好各个数据结构的表达
#include<bits/stdc++.h>
//(列,行),一定要先思考好,保证一致性
using namespace std;
using ll =long long;
using pii = pair<int,int> ;
const int N = 1e2+4;
int m,n,dest_x,dest_y,k;
int mmap[N][N];
int d[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
map<int,set<int>> ss; //time:队伍
map<pii,int> pos; //队伍坐标:队伍编号
//整个思路是从终点往外BFS
bool has_go[N][N]; //和地图是一一对应的
void BFS(){
//存的x和y是坐标与地图相反
queue<array<int,3>> q;
q.push({dest_x,dest_y,0});
while(!q.empty()){
auto f=q.front();
q.pop();
int x=f[0],y=f[1],t=f[2];
if(has_go[y][x])continue;
has_go[y][x]=true;
if(pos.find(make_pair(x,y))!=pos.end()) ss[t].insert(pos[make_pair(x,y)]);
for(int i=0;i<4;i++){
int nx=x+d[i][0],ny=y+d[i][1];
if(mmap[ny][nx]!=0&&!has_go[ny][nx])
q.push({nx,ny,t+1});
}
}
}
int main()
{
scanf("%d%d",&m,&n);
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
scanf("%d",&mmap[i][j]);
if(mmap[i][j]==2)
dest_x=j,dest_y=i;
}
}
scanf("%d",&k);
for(int i=1;i<=k;i++){
int x,y;
scanf("%d%d",&x,&y);
pos[make_pair(x,y)]=i;
}
BFS();
int ans=-1,ans_time=numeric_limits<int>::max();
for(auto sss:ss){
if(sss.second.size()==1&&sss.first<ans_time)
ans=*(sss.second.begin()),ans_time=sss.first;
}
if(ans==-1)
puts("No winner.");
else{
printf("%d %d\n",ans,ans_time);
}
return 0;
}