3 4 1 2 3 4 0 0 0 0 4 3 2 1 4 1 1 3 4 1 1 2 4 1 1 3 3 2 1 2 4 3 4 0 1 4 3 0 2 4 1 0 0 0 0 2 1 1 2 4 1 3 2 3 0 0
YES NO NO NO NO YES
想到控制是否拐弯的 条件 是一个重点
# include<stdio.h> # include<string.h> int map[1100][1100],vis[1100][1100],step[4][2]={1,0,0,1,-1,0,0,-1};//下 右 上 左 int x1,x2,y1,y2,flag,n,m; void DFS(int x,int y,int turn,int in)//x y 拐弯t次 p方向 { int i,nx,ny; if(turn>2)return;//拐弯2次以上 if(x==x2&&y==y2)//找到位置 { flag=1;return; } if(turn!=-1) { if(map[x][y]!=0)return;//走不通 for(i=0;i<4&&!flag;i++) { nx=x+step[i][0]; ny=y+step[i][1]; if(vis[nx][ny]==1)continue; vis[nx][ny]=1; if(in==i) DFS(nx,ny,turn,i); else DFS(nx,ny,turn+1,i); vis[nx][ny]=0; } } else for(i=0;i<4&&!flag;i++) { nx=x+step[i][0]; ny=y+step[i][1]; if(vis[nx][ny]==1)continue; vis[nx][ny]=1; DFS(nx,ny,turn+1,i); vis[nx][ny]=0; } } int main() { int i,ii,j,t; while(scanf("%d%d",&n,&m),n&&m) { memset(map,1,sizeof(map)); for(i=1;i<=n;i++) for(ii=1;ii<=m;ii++) scanf("%d",&map[i][ii]); scanf("%d",&t); while(t--) { flag=0; scanf("%d%d%d%d",&x1,&y1,&x2,&y2); if(map[x1][y1]!=map[x2][y2] || map[x1][y1]==0 || x1<1||x2<1||y1<1||y2<1||x1>n||x2>n||y1>m||y2>m) printf("NO\n"); else { memset(vis,0,sizeof(vis)); vis[x1][y1]=1; DFS(x1,y1,-1,-1); if(flag) printf("YES\n"); else printf("NO\n"); } } } return 0; }