DFS与BFS题解:[kaungbin]带你飞 简单搜索 解题报告
DFS and BFS
在解题前我们还是大致讲一下dfs与bfs的。(我感觉我不会bfs)
1.DFS
dfs(深度优先算法) 正如其名,dfs是相当的深度,不走到最深处绝不回头的那种。
深度优先搜索是一种枚举所有完整路径以遍历所有情况的搜索方法。
而使用递归可以很好地实现深度优先搜索。
在使用递归时,系统会调用一个叫系统栈的东西来存放递归中每一层的状态,因此使用递归来实现DFS的本质其实还是栈。
下面DFS的模版:
void dfs() { //参数用来表示状态
if(到达终点状态) {
...//根据题意添加
return;
}
if(越界或者是不合法状态)
return;
if(特殊状态)//剪枝
return ;
for(扩展方式) {
if(扩展方式所达到状态合法) {
修改操作;//根据题意来添加
标记;
dfs();
(还原标记);
//是否还原标记根据题意
//如果加上(还原标记)就是 回溯法
}
}
}
然后开始今天的题解
题目来自https://vjudge.net/problem/POJ-3984
迷宫问题
1.题目描述:2
定义一个二维数组:
int maze[5][5] = {
0, 1, 0, 0, 0,
0, 1, 0, 1, 0,
0, 0, 0, 0, 0,
0, 1, 1, 1, 0,
0, 0, 0, 1, 0,
};
它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线
Input
Output
Sample Input
0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0
Sample Output
(0, 0)
(1, 0)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(3, 4)
(4, 4)
2.题目分析
这道题就属于搜索中的基础题了,即给你一个地图,让你在地图中找出最短的路径.
而在搜索题中我们可以用上面所讲到的dfs(深度优先算法),还有一种就是bfs(广度优先算法)。两种方法都可以。
但是这道题是遍历迷宫的顺序,所以dfs不太好用,所以我们选择bfs,通过使用队列结构来存储路径。
下面是代码:
#include<stdio.h>
struct node{
int x; //x坐标
int y; //y坐标
int pre; //来出发点
};
int book[6][6]; //用来记录点是否访问过
int map[6][6]; //记录图
struct node queue[20]; //存储路径的队列
void print(struct node a) //实现路径输出的函数
{
if(a.pre==-1)
{
printf("(%d, %d)\n",a.x,a.y);
return ;
}
else
{
print(queue[a.pre]);
printf("(%d, %d)\n",a.x,a.y);
}
}
int main()
{
int i,j,k,m,n,x,y;
int head,tail;
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
scanf("%d",&map[i][j]);
}
}
head=0;
tail=0;
queue[tail].x=0;
queue[tail].y=0;
queue[tail].pre=-1;
book[0][0]=1;
tail++;
while(head<tail) //当队列为空时跳出,说明搜索没有找到可行路径
{
int next[4][2]={{0,1},{0,-1},{1,0},{-1,0}}; //定义出四个方向
int flag=0;
for(i=0;i<4;i++) //从当前点往四周探索
{
int nextx=queue[head].x+next[i][0];
int nexty=queue[head].y+next[i][1]; //实现移动
if(nextx<0||nextx>5||nexty<0||nexty>5) //超出了边界则跳出
{
continue;
}
if(book[nextx][nexty]==0&&map[nextx][nexty]==0) //当点未被访问过且是可行点才入队
{
book[nextx][nexty]=1;
queue[tail].x=nextx;
queue[tail].y=nexty;
queue[tail].pre=head;
tail++;
}
if(nextx==4&&nexty==4) //到达了目的地,毫无疑问地跳出结束循环
{
flag=1;
break;
}
}
if(flag) //到达目的地后调用函数输出路径
{
print(queue[tail-1]);
break;
}
head++; //出队
}
return 0;
}
主要注意的是队列的使用,其他都ok
DFS与BFS题解:[kaungbin]带你飞 简单搜索 解题报告的更多相关文章
- HDU - 1067 Gap (bfs + hash) [kuangbin带你飞]专题二
题意: 起初定28张卡牌的排列,把其中11, 21, 31, 41移动到第一列,然后就出现四个空白,每个空白可以用它的前面一个数的下一个数填充,例如43后面的空格可以用44填充,但是47后面即 ...
- 【算法系列学习三】[kuangbin带你飞]专题二 搜索进阶 之 A-Eight 反向bfs打表和康拓展开
[kuangbin带你飞]专题二 搜索进阶 之 A-Eight 这是一道经典的八数码问题.首先,简单介绍一下八数码问题: 八数码问题也称为九宫问题.在3×3的棋盘,摆有八个棋子,每个棋子上标有1至8的 ...
- 「kuangbin带你飞」专题十七 AC自动机
layout: post title: 「kuangbin带你飞」专题十七 AC自动机 author: "luowentaoaa" catalog: true tags: - ku ...
- Tarjan 联通图 Kuangbin 带你飞 联通图题目及部分联通图题目
Tarjan算法就不说了 想学看这 https://www.byvoid.com/blog/scc-tarjan/ https://www.byvoid.com/blog/biconnect/ 下面是 ...
- 「kuangbin带你飞」专题二十二 区间DP
layout: post title: 「kuangbin带你飞」专题二十二 区间DP author: "luowentaoaa" catalog: true tags: - ku ...
- Clone Graph leetcode java(DFS and BFS 基础)
题目: Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors. ...
- [kuangbin带你飞]专题十一 网络流
ID Origin Title 34 / 81 Problem A POJ 3436 ACM Computer Factory 92 / 195 Problem B POJ 3 ...
- 「kuangbin带你飞」专题二十 斜率DP
layout: post title: 「kuangbin带你飞」专题二十 斜率DP author: "luowentaoaa" catalog: true tags: mathj ...
- 「kuangbin带你飞」专题十九 矩阵
layout: post title: 「kuangbin带你飞」专题十九 矩阵 author: "luowentaoaa" catalog: true tags: mathjax ...
随机推荐
- nginx 开启,关闭,重启
2021-08-191. 启动 # 判断配置文件是否正确 cd /usr/local/nginx/sbin ./nginx -t # 启动 cd usr/local/nginx/sbin ./ngin ...
- C++之常指针,指针常量,函数指针,const用法总结
1.const char *p,char const *p,char * const p 对于C++而言,没有const * 修饰符,所以,const只可以修饰类型或者变量名.因而const char ...
- ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1122)
只需执行 /Applications/Python\ 3.9/Install\ Certificates.command
- vue element-ui 做分页功能之封装
在 vue 项目中的 components 中 创建一个 文件夹,文件夹里创建一个 name(这个名字你随意取).vue <template> <div class=" ...
- python实现分水岭算法分割遥感图像
1. 定义 分水岭算法(watershed algorithm)可以将图像中的边缘转化为"山脉",将均匀区域转化为"山谷",在这方面有助于分割目标. 分水岭算法 ...
- Intel® QAT加速卡之Linux上编程说明
QAT Software for Linux 1. Introduction 该程序员指南提供了有关软件体系结构和使用指南的信息. 相关的英特尔QAT软件库文档中记录了有关使用英特尔QuickAssi ...
- Redis集群的搭建及与SpringBoot的整合
1.概述 之前聊了Redis的哨兵模式,哨兵模式解决了读的并发问题,也解决了Master节点单点的问题. 但随着系统越来越庞大,缓存的数据越来越多,服务器的内存容量又成了问题,需要水平扩容,此时哨兵模 ...
- 用Java写了一个程序,将一个Mysql库中的表,迁移到另外一个server上的Mysql库中
用Navicat做数据迁移,因为数据量比较大,迁移过过程中一个是进展不直观,另外就是cpu占用率高的时候,屏幕跟死机了一样点不动按钮,不好中断. 想了想,干脆自己写一个. 在网上找了一个sqllite ...
- 使用tasker定时打开一耳光应用
比如现在要做一个:到9点钟自动打开"酷狗音乐"1.任务→点击"+"→填写"打开酷狗音乐"→点击"√"2.任务编辑→点击& ...
- Java on Visual Studio Code的更新 – 2021年8月
Nick Senior Program Manager, Developer Division at Microsoft 大家好,欢迎来到 8 月版的 Visual Studio Code Java ...