hdu 2102 bfs

#include<stdio.h>
#include<string.h>
#include<queue>
#define N 20
using namespace std;
int dis[4][2]={1,0,-1,0,0,1,0,-1};
int n,m,t;
struct node {
int x,y,time,f;
};
char ma[2][N][N];
int visit[2][N][N];
int judge(int x,int y,int f) {
if(x>=1&&x<=n&&y>=1&&y<=m&&ma[f][x][y]!='*'&&!visit[f][x][y])
    return 1;
return 0;
}
int bfs() {
queue<node>q;
node cur,next;
int i;
memset(visit,0,sizeof(visit));//刚开始忘了初始化wa了n次
cur.x=1;cur.y=1;cur.time=0;cur.f=0;
visit[0][1][1]=1;
q.push(cur);
while(!q.empty()) {
    cur=q.front();
    q.pop();
    if(cur.time>t)
        continue;
    if(cur.time<=t&&ma[cur.f][cur.x][cur.y]=='P')
        return 1;
    for(i=0;i<4;i++) {
        int xx=next.x=cur.x+dis[i][0];
        int yy=next.y=cur.y+dis[i][1];
        next.time=cur.time+1;
        next.f=cur.f;
        if(judge(xx,yy,cur.f)) {
            visit[cur.f][xx][yy]=1;
            if(ma[cur.f][xx][yy]=='#'&&(ma[(cur.f+1)%2][xx][yy]=='*'||ma[(cur.f+1)%2][xx][yy]=='#'))continue;//如果是‘#’和‘#’的话就无限循环了
            if(ma[cur.f][xx][yy]=='#'&&!visit[(cur.f+1)%2][xx][yy]) {
                next.f=(cur.f+1)%2;
                visit[next.f][xx][yy]=1;
            }
            q.push(next);
        }
    }
}
return 0;
}
int main() {
  int i,tt;
  scanf("%d",&tt);
  while(tt--) {
    scanf("%d%d%d",&n,&m,&t);
    for(i=1;i<=n;i++)
        scanf("%s",ma[0][i]+1);
    for(i=1;i<=n;i++)
        scanf("%s",ma[1][i]+1);
    if(bfs())
        printf("YES
");
    else
        printf("NO
");
  }
return 0;
}

原文地址:https://www.cnblogs.com/thefirstfeeling/p/4410737.html