一道单纯的模拟题,说的是一个人从起点去往终点,然后再由终点回到起点,判断其是否能够走完全部的点。
在行走的过程中存在规则,在一个位置优先走右,然后是前和左,最后是后。
注意:不是走到终点边缘的格子就ok了,还要判断方向(卡了我好久T_T)。
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
bool maps[550][550][4];
bool vis[550][550];
int R,C,en,ex;
int gox[4][4]={{1,0,-1,0},{0,-1,0,1},{-1,0,1,0},{0,1,0,-1}};
int goy[4][4]={{0,1,0,-1},{1,0,-1,0},{0,-1,0,1},{-1,0,1,0}};
int dfs(int x,int y,int endx,int endy,int hx){
//printf("x=%d y=%d hx=%d\n",x,y,hx);
//system("pause");
while (1){
int hy=1;
for (int i=0;i<4;i++){
int x0=x+gox[hx][i];
int y0=y+goy[hx][i];
if (x0==endx&&y0==endy) return 0;
if (!maps[x][y][(hx+i+3)%4]&&x0>=0&&x0<R&&y0>=0&&y0<C){
vis[x0][y0]=true;
//printf("%d %d %d %d %d\n",x0,y0,i,(hx+i+3)%4,maps[x][y][(hx+i+3)%4]);
x=x0;y=y0;hx=(hx+i+3)%4;
//printf("x=%d y=%d hx=%d\n",x,y,hx);
//system("pause");
//dfs(x0,y0,endx,endy,(hx+i+3)%4);
hy=0;
break;
}
}
if (hy) break;
}
return 0;
}
int main (){
int T;scanf("%d",&T);
while (T--){
memset(vis,0,sizeof(vis));
scanf("%d%d",&R,&C);
for (int i=0;i<R;i++)
for (int j=0;j<C;j++)
vis[i][j]=maps[i][j][0]=maps[i][j][1]=maps[i][j][2]=maps[i][j][3]=false;
scanf("%d%d",&en,&ex);
for (int i=0;i<2*R-1;i++){
if (i%2==0){
for (int j=0;j<C-1;j++){
int a;scanf("%d",&a);
if (a){
maps[i/2][j][0]=maps[i/2][j+1][2]=true;
}
}
}
else {
for (int j=0;j<C;j++){
int a;scanf("%d",&a);
if (a) {
maps[i/2][j][3]=maps[i/2+1][j][1]=true;
}
}
}
}
// for (int i=0;i<4;i++){
// printf("%d %d %d %d\n",gox[i][0],gox[i][1],gox[i][2],gox[i][3]);
// }
dfs(0,en,R,ex,3);
dfs(R-1,ex,-1,en,1);
int ans=1;
for (int i=0;i<R;i++)
for (int j=0;j<C;j++)
if (!vis[i][j]) {ans=0;break;}
if (ans) printf("YES\n");
else printf("NO\n");
}
return 0;
}