浅析搜索(search)NO.4

本文介绍了使用广度优先搜索(BFS)解决迷宫问题的方法,包括从起点到终点的最短步数计算及最少步数路径的计数。在初始代码实现中,通过不断调整和优化,如增加剪枝策略,解决了导致超时(TLE)的问题,最终实现了正确求解并提高效率。文章展示了如何通过编程技巧改进算法性能。

迷宫(3):

 

【题目部分】

有一个mn格的迷宫(表示有m行、n列),其中有可走的也有不可走的,如果用0表示可以走,1表示不可走,文件读入这mn个数据和起始点、结束点(起始点和结束点都是用两个数据来描述的,分别表示这个点的的行号和列号)。现在要你编程找出从起点到终点的最少步数和最少步数的总走法,要求所走的路中没有重复的点,走时只能是上下左右四个方向。如果一条路都不可行,则输出“No Answer! ”。

Input

 

第一行是两个数 m、n,接下来是m行n列由10组成的数据,最后两行是起始点(X1,X2)和结束点(Y1,Y2)。

数据范围:0 < M,N <= 2000 , 0〈 X1,X2〈= N,0〈 Y1,Y2〈= M。

 

Output

 

一行两个数,表示最少步数和最少步数走法总数。如果走不到,则输出“No Answer! ”

 

Sample Input 1

3 5

0 0 0 0 0 

0 1 0 1 0

0 0 0 0 0

1 1

3 5



Sample Output 1

6 3

Hint

输出说明:

最少需要6步到达结束点。

总共三种6步的走法。

                                                                                                                      ——摘自学校OJ

刚刚做完迷宫(2)不想写迷宫(2)的题解,因为懒qwq,学了一下广度优先搜索(不知道的看着广搜),看到这题我的思路是:先广搜找到最少步数,然后用深搜穷举每条路的到达终点的步数,如果和最少步数相同,就把方案数+1。

 

代码实现:

#include<bits/stdc++.h>
using namespace std;
#define ll long long 
bool walk[2011][2011]={0},ma[2011][2011],w[2011][2011];
int dx[]={0,0,1,-1},dy[]={-1,1,0,0};
struct node{
	ll x,y,step;
};
queue<node> q;//queue即队列,负责广搜
node temp,s,e,x,t;
ll N,M;
bool bj=1;
ll ans=0,walker;
void dfs(ll X,ll Y,ll js){
	if(X==e.x&&Y==e.y){
		if(js==ans){
			walker++;
			return ;
		}
		else
			return ;
	}
	else{
	    ...
	}
	return ;
}
int main(){
	memset(walk,1,sizeof(walk));
	memset(w,1,sizeof(w));
	cin>>N>>M;
	for(int i=1;i<=N;i++){
		for(int j=1;j<=M;j++){
			cin>>walk[i][j];
			w[i][j]=walk[i][j];
		}
	}
	cin>>s.x>>s.y>>e.x>>e.y;
	s.step=0;
	q.push(s);
	while(!q.empty()){
		t=q.front();
		q.pop();
		for(int i=0;i<4;i++){
			temp.x=t.x+dx[i];
			temp.y=t.y+dy[i];
			temp.step=t.step+1;
			if(walk[temp.x][temp.y]==0){
				walk[temp.x][temp.y]=1;
				if(temp.x==e.x&&temp.y==e.y){
					ans=temp.step;
					break;
				}
				else
					q.push(temp);
			}
		}
	}
	if(ans==0){
		cout<<"No Answer!";
		return 0;
	}
	dfs(s.x,s.y,0);
	if(ans!=0){
		cout<<ans<<" "<<walker;
	}
	return 0;
}

提交以后发现,有个点TLE了,想了想应该是广搜部分找到最优解后没有及时退出的原因,我就又改了一下:

while(!q.empty()){
		t=q.front();
		q.pop();
		for(int i=0;i<4;i++){
			temp.x=t.x+dx[i];
			temp.y=t.y+dy[i];
			temp.step=t.step+1;
			if(walk[temp.x][temp.y]==0){
				walk[temp.x][temp.y]=1;
				if(temp.x==e.x&&temp.y==e.y){
					ans=temp.step;
					bj=0;
					break;
				}
				else
					q.push(temp);
			}
		}
		if(!bj)
			break;
	}//bj负责查看是否已找到最优解

再提交了一下,又双叒叕TLE了,仔细一想,深搜部分剪枝没用上!

于是乎:

inline void dfs(ll X,ll Y,ll js){
	if(js>ans)
		return ;
	if(X==e.x&&Y==e.y){
		if(js==ans){
			walker++;
			return ;
		}
		else
			return ;
	}
	else{
		.......
	}
	return ;
}

直接莽一波,提交!

AC了qwq

主要框架都在上方,如何补全代码就看你了↖(^ω^)↗

                                                                                      ——溜了溜了qwq

先看效果: https://renmaiwang.cn/s/jkhfz Hue系产品将具备高度的个性化定制能力,并且借助内置红、蓝、绿三原色LED的灯泡,能够混合生成1600万种不同色彩的灯光。 整个操作流程完全由安装于iPhone上的应用程序进行管理。 这一创新举措为智能照明控制领域带来了新的启示,国内相关领域的从业者也积极投身于相关研究。 鉴于Hue产品采用WiFi无线连接方式,而国内WiFi网络尚未全面覆盖,本研究选择应用更为普及的蓝牙技术,通过手机蓝牙与单片机进行数据交互,进而产生可调节占空比的PWM信,以此来控制LED驱动电路,实LED的调光功能以及DIY调色方案。 本文重阐述了一种基于手机蓝牙通信的LED灯设计方案,该方案受到飞利浦Hue智能灯泡的启发,但考虑到国内WiFi网络的覆盖限制,故而选用更为通用的蓝牙技术。 以下为相关技术细节的详尽介绍:1. **智能照明控制系统**:智能照明控制系统允许用户借助手机应用程序实远程控制照明设备,提供个性化的调光及色彩调整功能。 飞利浦Hue作为行业领先者,通过红、蓝、绿三原色LED的混合,能够呈1600万种颜色,实了全面的定制化体验。 2. **蓝牙通信技术**:蓝牙技术是一种低成本、短距离的无线传输方案,工作于2.4GHz ISM频段,具备即插即用强抗干扰能力。 蓝牙协议栈由硬件层软件层构成,提供通用访问Profile、服务发应用Profile以及串口Profiles等丰富功能,确保不同设备间的良好互操作性。 3. **脉冲宽度调制调光**:脉冲宽度调制(PWM)是一种高效能的调光方式,通过调节脉冲宽度来控制LED的亮度。 当PWM频率超过200Hz时,人眼无法察觉明显的闪烁象。 占空比指的...
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值