搜索的题就是要细心
#include<stdio.h> #include<string.h> #include<queue> #define inf 0x3fffffff using namespace std; int vis[2][11][11]; char map[2][11][11]; int n,m,T; int dir[4][2]={0,1,1,0,0,-1,-1,0}; struct op { int k,x,y,step; }; int judge(int k,int x,int y) { if(x<0||x>=n||y<0||y>=m||map[k][x][y]=='*') return 0; return 1; } int bfs() { int i,x,y,step,k; queue<op>Q; op cur,next; cur.k=0; cur.x=0; cur.y=0; cur.step=0; Q.push(cur); vis[0][0][0]=0; while(!Q.empty()) { cur=Q.front(); Q.pop(); if(cur.step>T)continue; if(map[cur.k][cur.x][cur.y]=='P') return cur.step; for(i=0;i<4;i++) { x=cur.x+dir[i][0]; y=cur.y+dir[i][1]; k=cur.k; step=cur.step+1; if(map[k][x][y]=='#') { k=(k+1)%2; if(map[k][x][y]=='#'||map[k][x][y]=='*') continue; } if(judge(k,x,y)==0)continue; if(vis[k][x][y]>step) { vis[k][x][y]=step; next.k=k; next.step=step; next.x=x; next.y=y; Q.push(next); } } } return -1; } int main() { int t,i,j,p; scanf("%d",&t); while(t--) { for(i=0;i<2;i++) for(j=0;j<11;j++) for(p=0;p<11;p++) vis[i][j][p]=inf; scanf("%d%d%d",&n,&m,&T); for(i=0;i<n;i++) scanf("%s",map[0][i]); for(i=0;i<n;i++) scanf("%s",map[1][i]); j=bfs(); if(j==-1) puts("NO"); else puts("YES"); } return 0; }