您的位置:首页 > 其它

hdu 2102 A计划

2013-04-19 18:15 351 查看
题目 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: