http://acm.hdu.edu.cn/showproblem.php?pid=2102
本题又是一道BSF搜索求最短路,只是在遇到‘#’时空传输时要注意一下,如果‘#’所对应的另一个迷宫位置也是‘#’时是没有意思的。
#include <iostream>
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
#include <queue>
#include <algorithm>
using namespace std;
char map[25][15];
int T,co,ro;
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}},visited[25][15];
struct coor
{
int x,y;
int step;
};
queue<coor>que;
bool judge(int x,int y,int flag)
{
if(x<0||y<0||y>=ro)
return false;
if(flag<co)
{
if(x>=co)
return false;
}
else
{
if(x>=2*co||x<co)
return false;
}
if(visited[x][y]||map[x][y]=='*')
return false;
return true;
}
bool bfs()
{
int i,x,y;
coor in,out;
memset(visited,0,sizeof(visited));
while(!que.empty())
que.pop();
in.x=0;
in.y=0;
in.step=0;
que.push(in);
while(!que.empty())
{
out=que.front();
que.pop();
if(out.step>T)
return false;
if(map[out.x][out.y]=='P')
{
printf("YES\n");
return true;
}
for(i=0;i<4;i++)
{
x=out.x+dir[i][0];
y=out.y+dir[i][1];
if(!judge(x,y,out.x))
continue;
visited[x][y]=1;
in.x=x;
in.y=y;
if(map[x][y]=='#')
{
if(x<co)
in.x=x+co;
else
in.x=x-co;
visited[x][y]=1;
}
in.step=out.step+1;
que.push(in);
}
}
return false;
}
int main()
{
int cas,i,j;
scanf("%d",&cas);
while(cas--)
{
scanf("%d%d%d",&co,&ro,&T);
for(i=0;i<2*co;i++)
scanf("%s",map[i]);
for(i=0;i<co;i++)
for(j=0;j<ro;j++)
{
if((map[i][j]=='#'&&map[i+co][j]=='#')||(map[i][j]=='#'&&map[i+co][j]=='*')||(map[i][j]=='*'&&map[i+co][j]=='#'))
{
map[i][j]='*';
map[i+co][j]='*';
}
}
if(!bfs())
printf("NO\n");
}
return 0;
}