1 5 5 14 S*#*. .#... ..... ****. ...#. ..*.P #.*.. ***.. ...*. *.#..
YES
ac代码:
#include<stdio.h> #include<string.h> #include<iostream> #include<queue> #include<algorithm> using namespace std; struct s { int a; int b; int c; int step; }e,f; char map[2][11][11]; int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; int v[2][11][11]; int bz,n,m,num; int time; int check(s aa) { if(aa.a<0||aa.a>=n||aa.b<0||aa.b>=m||map[aa.c][aa.a][aa.b]=='*') return 1; if(v[aa.c][aa.a][aa.b]) return 1; return 0; } void bfs() { queue<s>q; e.a=0; e.b=0; e.c=0; e.step=0; v[0][0][0]=1; q.push(e); while(!q.empty()) { int i; e=q.front(); q.pop(); if(map[e.c][e.a][e.b]=='P') { num=e.step; bz=1; return; } for(i=0;i<4;i++) { f.a=e.a+dir[i][0]; f.b=e.b+dir[i][1]; f.c=e.c; if(check(f)) continue; if(map[f.c][f.a][f.b]=='#')//一个传送阵只能用一次,这里也wrong了几次 { v[f.c][f.a][f.b]=1; if(f.c==1)//改变层数 f.c=0; else f.c=1; } v[f.c][f.a][f.b]=1; f.step=e.step+1; q.push(f); } } } int main() { int t,i,j; scanf("%d",&t); while(t--) { bz=0; scanf("%d%d%d",&n,&m,&time); memset(v,0,sizeof(v)); for(j=0;j<2;j++) { for(i=0;i<n;i++) { scanf("%s",map[j][i]); } } for(i=0;i<n;i++)//如果上层是传送,下层是墙或者下层是传送,表示不能行,直接修改为墙。这里wrong了几次 { for(j=0;j<m;j++) { if (map[0][i][j]=='#'&&map[1][i][j]=='*') { map[0][i][j]='*'; } else if(map[0][i][j]=='#'&&map[1][i][j]=='#') { map[0][i][j]=map[1][i][j]='*'; } else if (map[1][i][j]=='#'&&map[0][i][j]=='*') { map[1][i][j]='*'; } } } bfs(); if(bz&&num<=time) printf("YES\n"); else printf("NO\n"); } return 0; }