题目 http://acm.hdu.edu.cn/showproblem.php?pid=2102
刚开始做这个题目时候呢 不会做 不知道怎么样下手 看了一下别人代码又觉得很容易哦
在这里要注意二个地方 1. 当某个位置 第一层 第二层都是 # 时 要小心 就可以把它们当做是 * 一堵墙 呵呵
2. 当某个位置 第一层是 # 第二层是 * 时 要注意 你可以把二个位置都当做 * 或者第一层是 * 第二层是 # 也一样哦。。
具体看代码
#include<iostream>
#include<cstring>
#include<queue>
#include<cstdio>
using namespace std;
struct node{
int x,y,z;
int time;
};
int sx,sy,sz,ex,ey,ez,N,M,T,mark[3][12][12]; ///mark标记
char a[3][12][12]; ///记录
int dre[4][2]={{-1,0},{1,0},{0,-1},{0,1}}; ///上下左右
void DFS()
{
queue<node>Q; ///队列
node d,p;
d.x=sx;
d.y=sy;
d.z=sz; ///公主位置
d.time=0; ///时间
mark[sz][sx][sy]=1;
Q.push(d);
while(!Q.empty())
{
p=Q.front();
Q.pop();
if(p.time>T) break; ///超时
if(p.time<=T&&p.x==ex&&p.y==ey&&p.z==ez) ///是否是P点
{
cout<<"YES"<<endl;
return ;
}
int i;
for(i=0;i<4;i++) ///上下左右
{
d=p;
d.x+=dre[i][0];
d.y+=dre[i][1];
///在这个数组里面
if(d.x>=1&&d.x<=N&&d.y>=1&&d.y<=M&&d.z>=1&&d.z<=2&&a[d.z][d.x][d.y]!='*'&&!mark[d.z][d.x][d.y])
{
mark[d.z][d.x][d.y]=1;
if(a[d.z][d.x][d.y]=='.'||a[d.z][d.x][d.y]=='P') ///记录时间
{
d.time+=1;
}
if(a[d.z][d.x][d.y]=='#') ///是否可以转入另外一层
{
if(d.z==1)
d.z=2;
else
d.z=1;
d.time+=1;
mark[d.z][d.x][d.y]=1; ///标记点
}
Q.push(d); ///把d放入Q中
}
}
}
cout<<"NO"<<endl;
}
int main()
{
int c,i,j,k;
scanf("%d",&c);
while(c--)
{
scanf("%d %d %d",&N,&M,&T);
for(k=1;k<=2;k++)
for(i=1;i<=N;i++)
for(j=1;j<=M;j++)
{
cin>>a[k][i][j];
if(a[k][i][j]=='S')
{
sx=i,sy=j,sz=k;///记录公主位置
}
if(a[k][i][j]=='P')
{
ex=i,ey=j,ez=k;///出口
}
/// a[i][j][k]=
mark[k][i][j]=0; ///初始化
}
///不能转的# 简化一下
for(i=1;i<=N;i++)
for(j=1;j<=M;j++)
{
if(a[1][i][j]==a[2][i][j]&&a[1][i][j]=='#') ///如果第一层第二层都是# 就相当与*
{
a[1][i][j]=a[2][i][j]='*';
}
if(a[1][i][j]=='#'&&a[2][i][j]=='*') ///注意
{
a[1][i][j]='*';
}
if(a[2][i][j]=='#'&&a[1][i][j]=='*') ///同理
{
a[2][i][j]='*';
}
}
DFS();
}
return 0;
}