题意:略
思路:此题陷阱超多,当##,#*,*#时不能走进去,套下模板就行了。
#include <iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; #define N 20 struct node{ int x,y,z; int step; }pri; int next[][2]={{1,0},{0,1},{-1,0},{0,-1}}; char map[2][N][N]; int n,m,time; bool vis[2][N][N]; bool check(node a){ if(a.x>=0&&a.x<n&&a.y>=0&&a.y<m&&map[a.z][a.x][a.y]!=‘*‘ &&!vis[a.z][a.x][a.y]&&a.step<=time) return 1; return 0; } bool bfs(){ int i; queue<node>q; node tmp; memset(vis,0,sizeof(vis)); q.push(pri); vis[pri.z][pri.x][pri.y]=1; while(!q.empty()){ tmp=q.front(); q.pop(); if(map[tmp.z][tmp.x][tmp.y]==‘P‘&&tmp.step<=time) return 1; for(i=0;i<4;i++){ node u; u=tmp; u.x+=next[i][0]; u.y+=next[i][1]; u.step+=1; if(check(u)){ vis[u.z][u.x][u.y]=1; if(map[u.z][u.x][u.y]==‘#‘&&!vis[(u.z+1)%2][u.x][u.y]){ u.z=(u.z+1)%2; } q.push(u); } } } return 0; } int main(int argc, char** argv) { int t,i,j,k; scanf("%d",&t); while(t--){ scanf("%d%d%d",&n,&m,&time); for(k=0;k<2;k++) for(i=0;i<n;i++){ scanf("%s",map[k][i]); for(j=0;j<m;j++){ if(map[k][i][j]==‘S‘){ pri.x=i; pri.y=j; pri.z=k; pri.step=0; } } } for(i=0;i<n;i++) for(j=0;j<m;j++){ if(map[0][i][j]==‘#‘&&map[1][i][j]==‘#‘) map[0][i][j]=map[1][i][j]=‘*‘; if(map[0][i][j]==‘*‘&&map[1][i][j]==‘#‘) map[0][i][j]=map[1][i][j]=‘*‘; if(map[1][i][j]==‘*‘&&map[0][i][j]==‘#‘) map[0][i][j]=map[1][i][j]=‘*‘; } if(bfs()) printf("YES\n"); else printf("NO\n"); } return 0; }
hdu 2102 A计划_bfs搜索,布布扣,bubuko.com
原文:http://blog.csdn.net/neng18/article/details/20863513