虽然多了一层,但是还是比较基础的搜索题目,在T时间内,其实只要求出最小时间就可以了,然后比较两者,既然是求最小的时间,那么用广搜就比较好了……
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
struct node
{
int f;
int x,y;
}n1;
char map[2][12][12];
int vis[2][12][12];
int n,p,t,time;
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
int fp,xp,yp;
queue<node> q;
void bfs()
{
node m,k;
while(!q.empty())
{
m=q.front();
//cout<<m.f<<" "<<m.x<<" "<<m.y<<endl;
q.pop();
if(m.f==fp&&m.x==xp&&m.y==yp)
{
time=vis[fp][xp][yp]-1;//因为起点被赋值为1了
return;
}
for(int i=0;i<4;i++)
{
k=m;
k.x+=dx[i];
k.y+=dy[i];
if((k.x)>=0&&(k.x)<n&&(k.y)>=0&&(k.y)<p&&map[k.f][k.x][k.y]!='*'&&vis[k.f][k.x][k.y]==0)
{
vis[k.f][k.x][k.y]=vis[m.f][m.x][m.y]+1;
//cout<<vis[k.f][k.x][k.y]<<" "<<m.f<<" "<<m.x<<" "<<m.y<<endl;
if(map[k.f][k.x][k.y]=='#'&&map[!k.f][k.x][k.y]!='*'&&map[!k.f][k.x][k.y]!='#')//这里我认为是要加这个的,不然会一直在两个时空穿梭机里面来来去去……
{
vis[!k.f][k.x][k.y]=vis[k.f][k.x][k.y];//这里一定要注意,经过时空穿梭机到另一面后也要记录其步数,起初,没有考虑这个,WA,最后用输出查出来发现了这里……
k.f=!k.f;
q.push(k);
}
else if(map[k.f][k.x][k.y]=='.'||map[k.f][k.x][k.y]=='P')
{
q.push(k);
}
}
}
}
}
int main()
{
int T;
cin>>T;
while(T--)
{
cin>>n>>p>>t;
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<p;j++)
{
cin>>map[0][i][j];//这里我感觉用cin输入比较好一点,毕竟cin是忽略空格和空行的
if(map[0][i][j]=='P')
{
fp=0;
xp=i;
yp=j;
}
}
}
for(i=0;i<n;i++)
{
for(j=0;j<p;j++)
{
cin>>map[1][i][j];
if(map[1][i][j]=='P')
{
fp=1;
xp=i;
yp=j;
}
}
}
memset(vis,0,sizeof(vis));
while(!q.empty())//q必须得被清空
q.pop();
n1.f=0;
n1.x=0;
n1.y=0;
time=10000000;
vis[0][0][0]=1;//记得赋值
q.push(n1);
bfs();
//cout<<time<<endl;
if(time>t)
cout<<"NO"<<endl;
else
cout<<"YES"<<endl;
}
return 0;
}