原题:Gym-100971J
题意:
n*m地图,每次只能走上下左右四个方向中的一个,走一格,#不能走,有A,B两个机器人,在同一时间不能落在一个格子里,且不能对换位置,问是否可以交换位置
解析:
首先,需要A和B连通
然后,你可能走到一个可以走三个方向的格子,你就可以让一个机器人躲进去,从而交换位置
如果没有这种情况,还有一种可行的办法是AB间存在一个环
代码:
string M[200000],vis[200000];
int n,m;
struct node{
int x,y;
node(){}
node(int x,int y):x(x),y(y){}
};
int d[4][2]={{1,0},{0,-1},{0,1},{-1,0}};
int yes=0;
int f=0;
int ch(node p){int s=0;
for(int i=0;i<4;i++){
int x=p.x+d[i][0],y=p.y+d[i][1];
if(x<0||x>=n||y<0||y>=m||M[x][y]=='#')continue;
s++;
}
if(s==1)f=1;
if(s>2)return 1;
return 0;
}
void bfs(node p){
if(ch(p))yes=1;
queue<node>q;
vis[p.x][p.y]='y';q.push(p);
while(!q.empty()){
node t=q.front();q.pop();
for(int i=0;i<4;i++){
int x=t.x+d[i][0],y=t.y+d[i][1];
if(x<0||x>=n||y<0||y>=m||vis[x][y]=='y'||M[x][y]=='#')continue;
vis[x][y]='y';q.push(node(x,y));if(ch(node(x,y)))yes=1;
}
}
}
main(){
n,m;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)cin>>M[i],vis[i]=M[i];
node st,en;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(M[i][j]=='1'){st.x=i,st.y=j;}
if(M[i][j]=='2'){en.x=i,en.y=j;}
}
}
bfs(st);
if(vis[en.x][en.y]!='y')printf("NO\n");
else if(yes)printf("YES\n");
else{
if(f)printf("NO\n");
else printf("YES\n");
}
}