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 ...
随机推荐
- MySQL主从不同步、数据不一致解决办法
第一种:通过sql_slave_skip_counter跳过同步错误,适用于一般异常如插入时主键冲突 这种情况一般是在从库进行了写操作,错误提示 Last_SQL_Errno: 1062 Last_S ...
- jquery/vue/react前端多语言国际化翻译方案指南
❝ 本文章共3470字,预计阅读时间5-10分钟. ❞ 国际化-前言 每个开发者能希望编写的程序可以让全世界的用户使用,它要求从产品中抽离所有地域语言,国家/地区和文化相关的元素.换种说法,「应用程序 ...
- Python语法之函数、引用和装饰器
所谓函数,就是把具有独立功能的代码块组织成为一个小模块,在需要的时候调用 函数是带名字的代码块,用于完成具体的工作 需要在程序中多次执行同一项任务时,你无需反复编写完成该任务的代码,而只需调用该 任务 ...
- 在同一台计算机中运行多个MySQL服务
目录 一.问题的来源 二.配置 1. 修改原来MySQL系统的my.ini文件 2. 修改注册表 3. 重新启动服务 4. 最终效果 一.问题的来源 这个学期里我需要修读<数据库系统>的课 ...
- 20210821 打表,蛇,购物,ants
考场 T1 没看懂 T4 一眼回滚莫队,但忘记怎么写了,小慌 模拟 T1 题意的时候教练让 zsy 澄清了一下,确定了我不会做... T2 一看就是毒瘤题,T3 感觉比较可做 T4 确定了回滚的细节, ...
- C# Equals方法和==有什么区别
开发工具:VS2019 一.关于这两个比较,需要从值类型和引用类型两方面来说 (A)先说值类型 上图: 因为在对值类型进行比较时候,不管 .Equals() 方法还是 == 方法,都是对值类型变量(图 ...
- QT 4.7.3 交叉编译环境搭建
测试平台 宿主机平台:Ubuntu 12.04.4 LTS 目标机:Easy-ARM IMX283 目标机内核:Linux 2.6.35.3 交叉编译器:arm-linux-gcc 4.4.4 tsl ...
- JUnit5 快速入门指南
1. 安装 在pom中添加依赖 <properties> <junit.jupiter.version>5.3.2</junit.jupiter.version> ...
- 【第十篇】- Git 远程仓库(Github)之Spring Cloud直播商城 b2b2c电子商务技术总结
Git 远程仓库(Github) Git 并不像 SVN 那样有个中心服务器. 目前我们使用到的 Git 命令都是在本地执行,如果你想通过 Git 分享你的代码或者与其他开发人员合作. 你就需要将数据 ...
- WPF listbox中Checkbox横向排列
<ListBox Height="220" Margin="0" ItemsSource="{Binding RightCollection}& ...