题意:
可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验。魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老。年迈的国王正是心急如焚,告招天下勇士来拯救公主。不过公主早已习以为常,她深信智勇的骑士LJ肯定能将她救出。
现据密探所报,公主被关在一个两层的迷宫里,迷宫的入口是S(0,0,0),公主的位置用P表示,时空传输机用#表示,墙用*表示,平地用.表示。骑士们一进入时空传输机就会被转到另一层的相对位置,但如果被转到的位置是墙的话,那骑士们就会被撞死。骑士们在一层中只能前后左右移动,每移动一格花1时刻。层间的移动只能通过时空传输机,且不需要任何时间
分析:把特殊情况处理掉就好,
①上下都是 ‘#’ ②上面或下面一个是‘#‘ 一个是是’*‘
那么上下都预处理成’*‘


#include <stdio.h> #include <string.h> #define clr(x) memset(x,0,sizeof(x)) #define INF 0x1f1f1f1f int f[8] = {-1,1,0,0, 0,0,-1,1}; struct node { int x,y,z; }q[300],tt,in,st,en; int v[2][11][11]; int step[2][11][11]; char g[2][11][11]; void init() { memset(step,INF,sizeof(step)); } int n, m, ti; bool ok(int x,int y) { if (x>=0 && x<n && y>=0 && y<m) return true; return false; } bool bfs() { int front=0, rear=0; int i, j, k; q[rear++] = st; step[st.z][st.x][st.y] = 0; while (front < rear) { tt = q[front++]; if (g[tt.z][tt.x][tt.y]=='P') { if (step[tt.z][tt.x][tt.y]<=ti) return true; } if (g[tt.z][tt.x][tt.y]!='#') { for (i=0; i<4; i++) { in.z = tt.z; in.x = tt.x+f[i]; in.y = tt.y+f[i+4]; if (ok(in.x,in.y) && g[in.z][in.x][in.y]!='*' && step[tt.z][tt.x][tt.y]+1<step[in.z][in.x][in.y]) { step[in.z][in.x][in.y] = step[tt.z][tt.x][tt.y]+1; q[rear++] = in; } } } else { in = tt; in.z = (tt.z+1)%2; if (step[tt.z][tt.x][tt.y]<step[in.z][in.x][in.y]) { step[in.z][in.x][in.y] = step[tt.z][tt.x][tt.y]; q[rear++] = in; } } } return false; } int main() { int t; int i, j, k; scanf("%d",&t); while (t--) { scanf("%d %d %d",&n,&m,&ti); init(); for (k=0; k<2; k++) { for (i=0; i<n; i++) { scanf("%s",g[k][i]); for (j=0; j<m; j++) { if (g[k][i][j] == 'S') st.x = i,st.y = j,st.z=k; } } } for (i=0; i<n; i++) for (j=0; j<m; j++) { if ((g[0][i][j]=='#'&&g[1][i][j]=='#') ||(g[0][i][j]=='#'&&g[1][i][j]=='*') ||(g[0][i][j]=='*'&&g[1][i][j]=='#')) g[0][i][j] = g[1][i][j] = '*'; } if (bfs()) printf("YES\n"); else printf("NO\n"); } return 0; }