【Gym 100971J】Robots at Warehouse
题意
链接
给你一个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; }
┆凉┆暖┆降┆等┆幸┆我┆我┆里┆将┆ ┆可┆有┆谦┆戮┆那┆ ┆大┆始┆ ┆然┆
┆薄┆一┆临┆你┆的┆还┆没┆ ┆来┆ ┆是┆来┆逊┆没┆些┆ ┆雁┆终┆ ┆而┆
┆ ┆暖┆ ┆如┆地┆站┆有┆ ┆也┆ ┆我┆ ┆的┆有┆精┆ ┆也┆没┆ ┆你┆
┆ ┆这┆ ┆试┆方┆在┆逃┆ ┆会┆ ┆在┆ ┆清┆来┆准┆ ┆没┆有┆ ┆没┆
┆ ┆生┆ ┆探┆ ┆最┆避┆ ┆在┆ ┆这┆ ┆晨┆ ┆的┆ ┆有┆来┆ ┆有┆
┆ ┆之┆ ┆般┆ ┆不┆ ┆ ┆这┆ ┆里┆ ┆没┆ ┆杀┆ ┆来┆ ┆ ┆来┆