您的位置:首页 > 其它

HDU 2102 A计划

2015-09-17 20:36 369 查看
坑点:1:当两边都是#号是,是死路

2:当两边种,一边是#,另一边是*是,也是死路。

其他都没啥好说的

这是一道比较难搞定的搜索题,三维立体搜索。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxm=20;
char map[maxm][maxm][maxm];
int vis[maxm][maxm][maxm];
int m,n,time;
int dir[4][2]= {{1,0},{-1,0},{0,1},{0,-1}};
struct node
{
int x;
int y;
int z;
int step;
} queue[maxm*maxm*maxm];
void bfs()
{
struct node now,pre;
int e=0,h=1;
queue[0].x=0;
queue[0].y=0;
queue[0].z=0;
queue[0].step=0;
vis[0][0][0]=1;
while(e<h)
{
pre=queue[e];
if(map[pre.z][pre.x][pre.y]=='P')
{
printf("YES\n");
return;
}
for(int i=0; i<4; i++)
{
now.x=pre.x+dir[i][0];
now.y=pre.y+dir[i][1];
now.z=pre.z;//非常重要
now.step=pre.step+1;
if(now.x>=0&&now.x<m&&now.y>=0&&now.y<n&&now.step<=time&&(!vis[now.z][now.x][now.y])&&map[now.z][now.x][now.y]!='*')
{
if(map[now.z][now.x][now.y]=='#')
{
vis[now.z][now.x][now.y]=1;
now.z=!now.z;
}
vis[now.z][now.x][now.y]=1;
queue[h++]=now;
}
}
e++;
}
printf("NO\n");
return;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int i,j,k;
memset(vis,0,sizeof(vis));
scanf("%d%d%d",&m,&n,&time);
for(i=0; i<2; i++)
{
for(j=0; j<m; j++)
{
scanf("%s",map[i][j]);
}
}
for(i=0;i<2;i++)
{
for(j=0;j<m;j++)
{
for(k=0;k<n;k++)
{
if((map[i][j][k]=='#'&&map[!i][j][k]=='#')||(map[i][j][k]=='*'&&map[!i][j][k]=='#')||(map[i][j][k]=='#'&&map[!i][j][k]=='*'))
{
map[i][j][k]=map[!i][j][k]='*';
}
}
}
}
bfs();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: