题目很简单,给你两层地图,S入口 *墙,.是路,P是目标,#是传送门,可以从某一层传到另外一层时间不会加1,在给出的时间限制从入口到出口,如果传送过去是墙就死掉。,。。。。。
坑点:遇到传送门就马上传送,两层可以相互传送,
注意:::清空队列
坑点:遇到传送门就马上传送,两层可以相互传送,
注意:::清空队列
结构体队列;;
DFS也可以做,没想出来 智障一般的我错了20次,辣鸡啊
优化:预处理地图中的#,如果下一层是#就把#改为*,以此类推;
第二个就是两层之间的转换,
if (map[now.z][next.x][next.y] == '#') next.z ^= 1;
这样会好一点;
Sample Input
1 5 5 14 S*#*. .#... ..... ****. ...#. ..*.P #.*.. ***.. ...*. *.#..
Sample Output
YES
#include<string.h>
#include<stdio.h>
#include<queue>
using namespace std;
char map[2][15][15];
int use[2][15][15];
int n,m,t,flag;
int dir[4][2]={-1,0,0,-1,1,0,0,1};
struct list1
{
int z;
int x;
int y;
int time;
}ans;
queue<list1> que;
void BFS()
{
while(!que.empty())
{
list1 tem=que.front();
que.pop();
if(map[tem.z][tem.x][tem.y]=='P')
{
if(tem.time<=t)
{
flag=1;
return ;
}
}
list1 next;
for(int i=0;i<4;i++)
{
next.z=tem.z;
next.x=tem.x+dir[i][0];
next.y=tem.y+dir[i][1];
next.time=tem.time+1;
if(next.z==1&&!use[next.z][next.x][next.y]&&next.x>=0&&next.x<n&&next.y>=0&&next.y<m&&map[next.z][next.x][next.y]=='#'&&next.time<=t)
{
if(map[0][next.x][next.y]!='#'&&map[0][next.x][next.y]!='*')
{
use[next.z][next.x][next.y]=1;
next.z=0;
que.push(next);
}
}
if(next.z==0&&!use[next.z][next.x][next.y]&&next.x>=0&&next.x<n&&next.y>=0&&next.y<m&&map[next.z][next.x][next.y]=='#'&&next.time<=t)
{
if(map[1][next.x][next.y]!='#'&&map[1][next.x][next.y]!='*')
{
use[next.z][next.x][next.y]=1;
next.z=1;
que.push(next);
}
}
if(map[next.z][next.x][next.y]!='#'&&!use[next.z][next.x][next.y]&&next.x>=0&&next.x<n&&next.y>=0&&next.y<m&&map[next.z][next.x][next.y]!='*'&&next.time<=t)
{
use[next.z][next.x][next.y]=1;
que.push(next);
}
}
}
}
int main()
{
int i,j,k,T;
scanf("%d",&T);
while(T--)
{
flag=0;
while (!que.empty())
que.pop();
memset(use,0,sizeof(use));
scanf("%d%d%d",&n,&m,&t);
for(i=0;i<2;i++)
{
for(j=0;j<n;j++)
scanf("%s",map[i][j]);
}
ans.x = 0, ans.y = 0, ans.z = 0, ans.time = 0;
use[0][0][0]=1;
que.push(ans);
BFS();
if(flag)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}