bfs
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
using namespace std;
int dir[4][2]={-1,0,1,0,0,1,0,-1},h,l,t;
char map1[11][11],map2[11][11];
bool vis1[11][11],vis2[11][11];
struct note{
int x;
int y;
int time;
int w;
}; //记录坐标 时间 第几张地图
int bfs()
{
if(map1[0][0]=='P') return 1; //判断一下起点是否为终点
queue<note>q;
struct note p;
p.x=0,p.y=0,p.time=0,p.w=1;
if(!q.empty()) q.pop();
q.push(p);
while(!q.empty())
{
struct note d;
struct note nex;
d=q.front();
q.pop();
// cout<<d.x<<" "<<d.y<<" "<<d.w<<" "<<d.time<<endl;
if(d.w==1)//父节点为第一个地图
{
for(int i=0;i<4;i++)
{
int xx=d.x+dir[i][0],yy=d.y+dir[i][1];
if(xx<0||xx>=h||yy<0||yy>=l||map1[xx][yy]=='*'||vis1[xx][yy]==1) continue;
vis1[xx][yy]=true;
if(map1[xx][yy]=='#')//下一步为时光机
{
if(map2[xx][yy]!='*'&&map2[xx][yy]!='#')//如果不死
{
if(map2[xx][yy]=='P')
{
if(d.time+1<=t) return 1;
else return 0;
}
vis2[xx][yy]=true;
nex.x=xx,nex.y=yy,nex.time=d.time+1,nex.w=2;
q.push(nex);
}
else continue;//死了
}
else if(map1[xx][yy]=='P') //找到终点
{
if(d.time+1<=t) return 1;
else return 0;
}
else
{
nex.x=xx,nex.y=yy,nex.time=d.time+1,nex.w=1;//继续搜索
q.push(nex);
}
}
}
if(d.w==2)//此时为第二张地图
{
for(int i=0;i<4;i++)
{
int xx=d.x+dir[i][0],yy=d.y+dir[i][1];
if(xx<0||xx>=h||yy<0||yy>=l||map2[xx][yy]=='*'||vis2[xx][yy]==1) continue;
vis2[xx][yy]=true;
if(map2[xx][yy]=='#')//下一步为时光机
{
if(map1[xx][yy]!='*'&&map1[xx][yy]!='#')//没死
{
if(map1[xx][yy]=='P')
{
if(d.time+1<=t) return 1;
else return 0;
}
vis1[xx][yy]=true;
nex.x=xx,nex.y=yy,nex.time=d.time+1,nex.w=1;
q.push(nex);
}
else continue;//死了
}
else if(map2[xx][yy]=='P')
{
if(d.time+1<=t) return 1;
else return 0;
}
else
{
nex.x=xx,nex.y=yy,nex.time=d.time+1,nex.w=2;
q.push(nex);
}
}
}
}
return 0;
}
int main()
{
int T,ans;
cin>>T;
while(T--)
{
memset(map1,0,sizeof(map1));
memset(map2,0,sizeof(map2));
memset(vis1,0,sizeof(vis1));
memset(vis2,0,sizeof(vis2));
cin>>h>>l>>t;
for(int i=0;i<h;i++)
for(int j=0;j<l;j++)
cin>>map1[i][j];
for(int i=0;i<h;i++)
for(int j=0;j<l;j++)
cin>>map2[i][j];
vis1[0][0]=true; //给起点标记
ans=bfs();
if(ans==1) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
dfs
#include <stdio.h>
#include <algorithm>
#include <stdlib.h>
using namespace std;
int dir[4][2]={-1,0,1,0,0,1,0,-1},h,l,t,flag,ans;
char map1[11][11],map2[11][11];
bool vis1[11][11],vis2[11][11];
void dfs(int x,int y,int w,int step,int flag)//当前坐标x,y,地图几,花费时间,上一步是否为#
{
if(step>ans||step>t) return ;//剪枝,不剪枝会t的,如果当前步数大于答案步数,剪枝,如果当前步数超过时间t,剪枝
if(w==0&&map1[x][y]=='P') //在地图1中找到终点
{
if(step<ans)
ans=step;
return;
}
if(w==1&&map2[x][y]=='P')//在地图2中找到终点
{
if(step<ans)
ans=step;
return;
}
if(flag==1)//如果上一次是#,跳转地图后如果是墙则直接死亡。
{
if(w==0) //此时为地图1
{
if(map1[x][y]=='*'||map1[x][y]=='#')
return;
}
if(w==1)//此时为地图2
{
if(map2[x][y]=='*'||map2[x][y]=='#')
return;
}
}
if(w==0)//地图1
{
for(int i=0;i<4;i++)
{
int xx=x+dir[i][0],yy=y+dir[i][1];
if(xx<0||xx>=h||yy<0||yy>=l||vis1[xx][yy]==1||map1[xx][yy]=='*') continue;
vis1[xx][yy]=true;
if(map1[xx][yy]=='#')//如果下一步是#
{
vis2[xx][yy]=true;//时光机对应地图位置也标记
dfs(xx,yy,1,step+1,1);
vis1[xx][yy]=false;
vis2[xx][yy]=false;
}
else
{
dfs(xx,yy,0,step+1,0);
vis1[xx][yy]=false;
}
}
}
if(w==1)
{
for(int i=0;i<4;i++)
{
int xx=x+dir[i][0],yy=y+dir[i][1];
if(xx<0||xx>=h||yy<0||yy>=l||vis2[xx][yy]==1||map2[xx][yy]=='*') continue;
vis2[xx][yy]=true;
if(map2[xx][yy]=='#')
{
vis1[xx][yy]=true;
dfs(xx,yy,0,step+1,1);
vis2[xx][yy]=false;
vis1[xx][yy]=false;
}
else
{
dfs(xx,yy,1,step+1,0);
vis2[xx][yy]=false;
}
}
}
}
int main()
{
int T;
cin>>T;
while(T--)
{
ans=999;
memset(map1,0,sizeof(map1));
memset(map2,0,sizeof(map2));
memset(vis1,0,sizeof(vis1));
memset(vis2,0,sizeof(vis2));
cin>>h>>l>>t;
for(int i=0;i<h;i++)
for(int j=0;j<l;j++)
cin>>map1[i][j];
for(int i=0;i<h;i++)
for(int j=0;j<l;j++)
cin>>map2[i][j];
vis1[0][0]=true;
dfs(0,0,0,0,0);
if(ans<=t) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}