kuangbin专题二 搜索进阶 I - A计划

本文介绍了一个迷宫救援问题的解决方案,使用广度优先搜索(BFS)算法在限定时间内找到公主的位置。考虑到双层迷宫及传送门带来的复杂性,算法还需处理骑士穿越不同层的情况。

I - A计划

  

可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验。魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老。年迈的国王正是心急如焚,告招天下勇士来拯救公主。不过公主早已习以为常,她深信智勇的骑士LJ肯定能将她救出。 
现据密探所报,公主被关在一个两层的迷宫里,迷宫的入口是S(0,0,0),公主的位置用P表示,时空传输机用#表示,墙用*表示,平地用.表示。骑士们一进入时空传输机就会被转到另一层的相对位置,但如果被转到的位置是墙的话,那骑士们就会被撞死。骑士们在一层中只能前后左右移动,每移动一格花1时刻。层间的移动只能通过时空传输机,且不需要任何时间。
Input输入的第一行C表示共有C个测试数据,每个测试数据的前一行有三个整数N,M,T。 N,M迷宫的大小N*M(1 <= N,M <=10)。T如上所意。接下去的前N*M表示迷宫的第一层的布置情况,后N*M表示迷宫第二层的布置情况。Output如果骑士们能够在T时刻能找到公主就输出“YES”,否则输出“NO”。Sample Input
1
5 5 14
S*#*.
.#...
.....
****.
...#.

..*.P
#.*..
***..
...*.
*.#..
Sample Output
YES

这次很快就写完了,wa了几次,忘记判断两边都是传送门的时候了,自己检查出来了。。。

#include<iostream>
#include<string.h>
#include<queue>
#include<string>
using namespace std ;
typedef long long ll;
typedef unsigned long long ull;
const int _max =15;
char mp[2][_max][_max];
int dx[]={1,-1,0,0};
int dy[]={0,0,1,-1};
bool vis[2][_max][_max];
struct node{
	int x,y;
	bool z;
	int t;
};
int n,m,T,x,y,z;
bool check( node s ){
	if(!vis[s.z][s.x][s.y]) return false;
	if(mp[s.z][s.x][s.y]=='*')return false;
	if(s.x>n-1||s.x<0||s.y>m-1||s.y<0) return false;
	return true;
}
void bfs(){
	queue<node>q;
	node now,next;
	now.x=x;
	now.y=y;
	now.z=z;
	now.t=0;
	q.push(now);
	vis[now.z][now.x][now.y]=0;
	while(!q.empty()){
		now=q.front();
		q.pop();
		if(mp[now.z][now.x][now.y]=='P'&&now.t<=T){
			cout<<"YES"<<endl;
			return;
		}
		for(int i=0;i<4;i++){
			next.x=now.x+dx[i];
			next.y=now.y+dy[i];
			next.z=now.z;
			next.t=now.t+1;
            if(!check(next)) continue;
			if(mp[next.z][next.x][next.y]=='#')
			{
				next.z=!next.z;
				if(mp[next.z][next.x][next.y]=='*'||vis[next.z][next.x][next.y]==0||mp[next.z][next.x][next.y]=='#') {
					vis[next.z][next.x][next.y]=vis[now.z][next.x][next.y]=0;
					continue;
				}
				vis[next.z][next.x][next.y]=vis[now.z][next.x][next.y]=0;
				q.push(next);
			}
			else {
				vis[next.z][next.x][next.y]=0;
				q.push(next);
			}
		}
		}
		cout<<"NO"<<endl; 
}
int main(){
	int c;
	cin>>c;
	while(c--){
	cin>>n>>m>>T;
	memset(vis,1,sizeof(vis));
	for(int k = 0 ; k <2 ; k++)
		for(int i=0;i<n;i++)
		   for( int j =0; j < m ; j++){
		   	cin>>mp[k][i][j];
		   	if(mp[k][i][j]=='S'){
		   		x=i;
				y=j;
				z=k; 
		   	}
			   }
			   bfs();
	}
	return 0;
}

 
已经博主授权,源码转载自 https://pan.quark.cn/s/a4b39357ea24 QueueForMcu 基于单片机实现的队列功能模块,主要用于8位、16位、32位非运行RTOS的单片机应用,兼容大多数单片机平台。 开源代码:https://.com/xiaoxinpro/QueueForMcu 一、特性 动态创建队列对象 动态设置队列数据缓冲区 静态指定队列元素数据长度 采用值传递的方式保存队列数据 、快速使用 三、配置说明 目前QueueForMcu只有一个静态配置项,具体如下: 在文件 中有一个宏定义 用于指定队列元素的数据长度,默认是 ,可以根据需要更改为其他数据类型。 四、数据结构 队列的数据结构为 用于保存队列的状态,源码如下: 其中 为配置项中自定义的数据类型。 五、创建队列 1、创建队列缓存 由于我们采用值传递的方式保存队列数据,因此我们在创建队列前要手动创建一个队列缓存区,用于存放队列数据。 以上代码即创建一个大小为 的队列缓存区。 2、创建队列结构 接下来使用 创建队列结构,用于保存队列的状态: 3、初始化队列 准备好队列缓存和队列结构后调用 函数来创建队列,该函数原型如下: 参数说明: 参考代码: 六、压入队列 1、单数据压入 将数据压入队列尾部使用 函数,该函数原型如下: 参数说明: 返回值说明: 该函数会返回一个 枚举数据类型,返回值会根据队列状态返回以下几个值: 参考代码: 2、多数据压入 若需要将多个数据(数组)压入队列可以使用 函数,原理上循环调用 函数来实现的,函数原型如下: 参数说明: 当数组长度大于队列剩余长度时,数组多余的数据将被忽略。 返回值说明: 该函数将返回实际被压入到队列中的数据长度。 当队列中的剩余长度富余...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值