HDU2102——《A计划》


**题目链接:**
       //http://acm.hdu.edu.cn/showproblem.php?pid=2102


 **题目分析:**
	被大神们说成水题的搜索,我硬是交了N遍一直WA,只能默默地测试,找BUG,终于还是
让我AC了。现在来分析一下这道题:看到此题,首先,应该想到的是用BFS,来写比较简单;然后,
注意它的起点是(0,0,0),终点P(x,y,z),由于是两层,当然要利用三维数组来存储,记录下终点
位置;接下来就是BFS了,搜索时注意'.'是路,'#'是时空传输机,‘*’是墙;主要是注意一下,
判断的条件,其他的就比较简单了,直接上代码吧。
    

**代码:**
<span style="font-size:14px;">#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <queue>
 using namespace std;
int C,N,M,T;
const int MAX_N = 1000;
const int INF = 0x7ffffff;
char map[2][MAX_N][MAX_N];   //地图
int d[2][MAX_N][MAX_N];      //到能够到达点的最短距离
bool visit[2][MAX_N][MAX_N]; //用于标记
int gx,gy,gz;                //起点已给,记录终点
typedef struct{
	int z,x,y;
}P;
int dx[6] ={1,0,-1,0,0,0}; 
int dy[6] ={0,-1,0,1,0,0};
int dz[6] ={0,0,0,0,1,-1};

void bfs()
{
	P p,q;
	p.z = 0;
	p.x = 0;
	p.y = 0;
	queue<P>que;
	que.push(p);
	d[0][0][0] = 0;
	visit[0][0][0] = true;
	while(que.size())
	{
		q = que.front();
		que.pop();	
		if(q.x == gx && q.y == gy && q.z == gz)
		{
			if(d[q.z][q.x][q.y] <= T)
			{
				printf("YES\n");
			}
			else
			{
				printf("NO\n");
			}
			return ;
		}
		if(map[q.z][q.x][q.y]=='.' ||(q.z == 0 && q.x==0 && q.y == 0))
		{  //要是是起点或者是'.'则在该层上的四个方向上访问;
			for(int i = 0 ;i < 4 ; i++) 
			{
				int nx = dx[i]+q.x;
				int ny = dy[i]+q.y;
				int nz = q.z;
				if(nx>=0&&ny>=0&&nz>=0 && nx<N&&ny<M&& nz<2 && !visit[nz][nx][ny] && map[nz][nx][ny] != '*')
				{
					p.x = nx;
					p.y = ny;
					p.z = nz;
					que.push(p);
					visit[nz][nx][ny] = true;
					d[nz][nx][ny] = d[q.z][q.x][q.y] + 1 ;
				}	
			}
		}
                //要是是'#'则跳转至另一层上去访问;
                if(map[q.z][q.x][q.y] == '#')
		{
			for(int i=4;i<6;i++)
			{
				int nz = dz[i]+q.z;
				int nx = q.x;
				int ny = q.y;
                                //注意判断条件,以及入队条件
                                if(nx>=0 && ny>=0 && nz>=0 && nx<N && ny<M && nz<2 && !visit[nz][nx][ny])
				{
					visit[nz][nx][ny] = true;
					if(map[nz][nx][ny] == '.'|| map[nz][nx][ny] == 'P')
					{
						p.x = nx;
						p.y = ny;
						p.z = nz;
						que.push(p);
						d[nz][nx][ny] = d[q.z][q.x][q.y];
					}
				}
			}
		}
	}
	printf("NO\n");
}


void solve()
{
	cin>>C;
	while(C--)
	{
		cin>>N>>M>>T;
		for(int i = 0 ; i < 2;i++)
		{
			for(int j=0;j<N;j++)
			{
				for(int k=0;k<M;k++)
				{
					cin>>map[i][j][k];
					d[i][j][k] = INF;
					visit[i][j][k] = false;
					if(map[i][j][k] == 'P')
					{
						gz = i;
						gx = j;
						gy = k;
					}
				}
			}
		}	
		bfs();
	}
}

int main()
{
	solve();
	return 0;
}

</span>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值