深度优先搜索(深搜)——Deep First Search【例题:迷宫】
深度优先搜索
基本思想:先选择一种可能情况向前探索,在探索过程中,一点那发现原来的选择是错误的,就退回一步重新选择,继续向前探索,(回溯)反复进行。
【例题】迷宫问题 ——【传送门】
思路:先随意选择一个方向,一步步向前试探,如果碰到死胡同说明该前进方向已经无路可走,这时首先看别的方向还是否有路可走,若有路可走,则该方向再次向前试探,若没有,则退回上一步,再看其他方向是否有路可走,,按此原则不断回溯和探索,知道找到入口为止。
框架:
int search(int ......)
{
;i<=方向总数;i++)
if(满足条件)
{
保存结果;
if(到达目的地)
输出解;
);
恢复:保存结果之前的状态{回溯一步};
}
}
具体代码实现如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#define MAXN 20
using namespace std;
int map[MAXN][MAXN];//表示迷宫地图
bool temp[MAXN][MAXN];//标记是否走过
]={,,,-};//横坐标的上下左右
]={-,,,};//纵坐标的上下左右
int m,n,total,sx,sy,fx,fy,l,r,t;//m,n:地图的长宽,total:方案总数,sx,sy起点的横纵坐标,fx,fy:终点的横纵坐标,t:障碍总数,l,r:障碍坐标
void search(int x,int y)//x,y:现在所在的点的坐标
{
if(x==fx&&y==fy)//到达终点
{
total++;//方案总数
return; //返回继续寻找
}
;i<=;i++)
&&map[x+dx[i]][y+dy[i]]==)//判断下面要走的路是否有障碍
&&y+dy[i]>=&&x+dx[i]<=n&&y+dy[i]<=m)//判断是否超越迷宫边界
{
temp[x+dx[i]][y+dy[i]]=;
search(x+dx[i],y+dy[i]);
temp[x+dx[i]][y+dy[i]]=;//回溯一步
}
}
int main()
{
cin>>n>>m>>t;
;i<=n;i++)
;j<=m;j++)
map[i][j]=;
cin>>sx>>sy;
cin>>fx>>fy;
;i<=t;i++)
{
cin>>l>>r;
map[l][r]=;
}
map[sx][sy]=;
search(sx,sy);
printf("%d",total);
;
}
深度优先搜索(深搜)——Deep First Search【例题:迷宫】的更多相关文章
- 深度优先搜索 DFS(Depath First Search, DFS)
深度优先搜索是一种枚举所有完整路径以遍历所有情况的搜索方法.(不撞南墙不回头) DFS一般用递归来实现,其伪代码思路过程一般如下: void DFS(必要的参数){ if (符和遍历到一条完整路 ...
- hdu 1501 基本搜索深搜
#include<stdio.h> #include<string.h> char s1[300],s2[300],s[500]; int len1,len2,len3,fla ...
- 算法与数据结构(四) 图的物理存储结构与深搜、广搜(Swift版)
开门见山,本篇博客就介绍图相关的东西.图其实就是树结构的升级版.上篇博客我们聊了树的一种,在后边的博客中我们还会介绍其他类型的树,比如红黑树,B树等等,以及这些树结构的应用.本篇博客我们就讲图的存储结 ...
- poj 2386:Lake Counting(简单DFS深搜)
Lake Counting Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 18201 Accepted: 9192 De ...
- DFS(一):深度优先搜索的基本思想
采用搜索算法解决问题时,需要构造一个表明状态特征和不同状态之间关系的数据结构,这种数据结构称为结点.不同的问题需要用不同的数据结构描述. 根据搜索问题所给定的条件,从一个结点出发,可以生成一个或多个新 ...
- 一本通例题埃及分数—题解&&深搜的剪枝技巧总结
一.简述: 众所周知,深搜(深度优先搜索)的时间复杂度在不加任何优化的情况下是非常慢的,一般都是指数级别的时间复杂度,在题目严格的时间限制下难以通过.所以大多数搜索算法都需要优化.形象地看,搜索的优化 ...
- [算法&数据结构]深度优先搜索(Depth First Search)
深度优先 搜索(DFS, Depth First Search) 从一个顶点v出发,首先将v标记为已遍历的顶点,然后选择一个邻接于v的尚未遍历的顶点u,如果u不存在,本次搜素终止.如果u存在,那么从u ...
- HDU 4597 Play Game(记忆化搜索,深搜)
题目 //传说中的记忆化搜索,好吧,就是用深搜//多做题吧,,这个解法是搜来的,蛮好理解的 //题目大意:给出两堆牌,只能从最上和最下取,然后两个人轮流取,都按照自己最优的策略,//问说第一个人对多的 ...
- [LeetCode OJ] Word Search 深度优先搜索DFS
Given a 2D board and a word, find if the word exists in the grid. The word can be constructed from l ...
随机推荐
- flume 自定义sink
http://flume.apache.org/FlumeDeveloperGuide.html#sink 看了 还是比较好上手的,简单翻译一下 sink的作用是从 Channel 提取 Event ...
- STM32Cubemx出现工程突然自动退出的问题
STM32Cubemx出现工程突然自动退出的问题 转载请注明出处,谢谢 https://www.cnblogs.com/kevin-nancy/p/10561944.html 或者 https://b ...
- bootstrap --datetimepicker之时间段选择
文件引入 <script type="text/javascript" src="css/jquery-3.2.1.js"></script& ...
- MVC5 model常见的写法
1.数据库表中为ID的字段 [Key] //关键字 [Required] //不为空 [Display(Name = "ID")] public int id { get; set ...
- 搭建一个最简单的node服务器
搭建一个最简单的node服务器 1.创建一个Http服务并监听8888端口 2.使用url模块 获取请求的路由和请求参数 var http = require('http'); var url = r ...
- urllib模块的使用
Python3学习笔记(urllib模块的使用) 1.基本方法 urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, ca ...
- Csharp:操作存儲過程輸出參數,和返回值
/// <summary> ///塗聚文 存儲過程輸出參數,和返回值 /// 20131030 /// Geovin Du /// </summary> /// <par ...
- jquery获取transform里面的值
用transform的translateX写了一个侧滑效果,如何获取它改变的值是多少呢? 获取translateX值的方法: $('div').css("transform").r ...
- 002Angular2工程目录解构
|--my-app 工程名 |--e2e 端到端测试 |--node_modules package.json列出的第三方模块放在此处 |--src |--app |--app.component.c ...
- em和px区别
附:(http://www.cnblogs.com/leejersey/p/3662612.html) em单位说明 1em指的是一个字体的大小,它会继承父级元素的字体大小,因此并不是一个固定的值.任 ...