题意
链接
给你一个n*m的地图,'#'代表墙,‘.’代表可走的,1代表1号机器人,2代表2号机器人,机器人可以上下左右移动到非墙的位置,但不能走到另一个机器人身上。问能否交换1和2的位置。
分析
如果1和2之间有路径且路径上某个点的度大于2,那就是YES,如果1和2的路径构成一个回路也是YES。其他情况就是NO。
代码
#include<cstdio> #define N 200005 int n,m,ux,uy,ax,ay,a[N],u[N],ck,ans,fx[4]= {1,-1,0,0},fy[4]= {0,0,1,-1}; char c; bool circle; void dfs(int x,int y,int s){ if(x==ax&&y==ay)//走到终点 ans++; if(x==ux&&y==uy&&s>2)//走回起点(s是第几步) circle = true; if(u[x*m-m+y]||ans>2||ans&&ck)return; u[x*m-m+y]=1; int r=0; for(int i=0;i<4;i++){ int nx=x+fx[i]; int ny=y+fy[i]; if(nx&&nx<=n&&ny&&ny<=m&&a[nx*m-m+ny]){ r++;//点的度 if(r>2)ck=1; dfs(nx,ny,s+1); } } } int main(){ scanf("%d%d ",&n,&m); for(int i=1; i<=n; i++) { for(int j=1; j<=m; j++) { c=getchar(); if(c!='#') a[i*m-m+j]=1; if(c=='1') { ux=i; uy=j; } else if(c=='2') { ax=i; ay=j; } } getchar(); } dfs(ux,uy,0); if(ans&&(ck||circle))printf("YES"); else printf("NO"); return 0; }