1 5 5 14 S*#*. .#... ..... ****. ...#. ..*.P #.*.. ***.. ...*. *.#..
YES
一碰见就懵了,两个矩阵怎么搜索,难道要挨着搜索?不可能吧,传送怎么弄。。。还是太菜,看了前辈的题解,才用队列的方法做了出来,而且花了很长时间,毕竟没刷过太多搜索题目,太生疏啊!!!况且三维数组,也没见过啊,STL也没熟练啊,以前的搜索题目没用过队列啊,学习!学习!!!
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
int m,n;
char smap[2][20][20];
int judge[2][20][20];
int go[2][4]={0,0,1,-1,-1,1,0,0};
struct point
{
int x,y,z;
int step;
};
queue<point> que;//
bool bfs()
{
while(!que.empty())
{
point now = que.front();
que.pop();
if(smap[now.z][now.x][now.y]=='P')
{
if(now.step>=0)
return true;
break;
}
point N;
for(int i=0;i<4;i++)
{
N.x=now.x+go[0][i];
N.y=now.y+go[1][i];
N.z=now.z;
N.step=now.step-1;
if(!(N.x>=0&&N.y>=0&&N.x<n&&N.y<m))//不满足条件
continue;
if(smap[now.z][N.x][N.y]=='#')
N.z^=1;//转移到第二个矩阵
if(smap[N.z][N.x][N.y]!='*'&&N.step>=0&&!judge[N.z][N.x][N.y])
{
judge[N.z][N.x][N.y]=1;
que.push(N);
}
}
}
return false;
}
int main()
{
int t,k;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&n,&m,&k);
point p;
while(!que.empty()) que.pop();//全体pop,出队列
memset(judge,0,sizeof(judge));//清空
for(int i=0;i<2;i++)
for(int j=0;j<n;j++)//还是字符串格式输入较好
{
scanf("%s",smap[i][j]);
}
for(int i=0;i<2;i++)
for(int j=0;j<n;j++)
for(int h=0;h<m;h++)
{
if(smap[i][j][h]=='S')
p.x=j,p.y=h,p.z=i,p.step=k;
else if(smap[i][j][h]=='#'&&(smap[i^1][j][h]=='#'||smap[i^1][j][h]=='*'))//都是传送门,会死循环
smap[i][j][h]='*',smap[i^1][j][h]='*';//所以和直接撞死没区别,都不可行,更新为墙
}
judge[p.z][p.x][p.y]=1;
que.push(p);
if(bfs())
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}
原文:http://blog.csdn.net/huatian5/article/details/51334286