深度优先搜索(深搜)——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 ...
随机推荐
- Ant利用第三方的task
转自 http://blog.sina.com.cn/s/blog_3d21e545010006s9.html 一.如何使用第三方任务 Ant可以使用第三方任务,在使用第三方任务之前,需告知Ant ...
- [實現DDD] 第11章 工廠
創建過程中須考慮一些重要細節, 否則所創建的聚合將處於不正確的狀態, 使用適當的工廠方法可以確保這一點, 而客戶端只需輸入基本的參數(通常是值對象), 另外, 工廠能更好地表達出通用語言, 使團隊成員 ...
- php二维数组排序方法(array_multisort usort)
一维数组排序可以使用asort.ksort等一些方法进程排序,相对来说比较简单.二维数组的排序怎么实现呢?使用array_multisort和usort可以实现 例如像下面的数组: $users = ...
- 《Python编程从入门到实践》_第八章_函数
一个简单的函数 先看一个简单的函数 def say_hello(): '''打印hello''' print("Hello!") say_hello() #运行结果 Hello! ...
- Java对象的生命周期与作用域的讨论(转)
导读: Java对象的生命周期大致包括三个阶段:对象的创建,对象的使用,对象的清除.因此,对象的生命周期长度可用如下的表达式表示:T = T1 + T2 +T3.其中T1表示对象的创建时间,T2表示对 ...
- POST 还是 GET?
POST 还是 GET? 浏览器使用 method 属性设置的方法将表单中的数据传送给服务器进行处理.共有两种方法:POST 方法和 GET 方法. 如果采用 POST 方法,浏览器将会按照下面两步来 ...
- MySql存储引擎MyISAM和InnoDB的区别
1.MySQL默认采用的是MyISAM. 2.MyISAM不支持事务,而InnoDB支持.InnoDB的AUTOCOMMIT默认是打开的,即每条SQL语句会默认被封装成一个事务,自动提交,这样会影响速 ...
- ASP.NET安全[开发ASP.NET MVC应用程序时值得注意的安全问题](转)
概述 安全在web领域是一个永远都不会过时的话题,今天我们就来看一看一些在开发ASP.NET MVC应用程序时一些值得我们注意的安全问题.本篇主要包括以下几个内容 : 认证 授权 XSS跨站脚本攻击 ...
- 用于模式匹配的String方法和RegExp方法
上一节总结了创建正则表达式的语法,这一篇笔者总结了用于模式匹配的String四个方法:search().replace().match().split()以及用于模式匹配的RegExp两个方法exec ...
- VC++中对数据类型的限制limits.h文件内容
limits.h文件中规定了是IDE在OS中规定了每个数据类型的最大值和最小值以及在程序源代码中编译时候所占用的字节数,这这样做有利于帮助程序员在编写程序的时候有效控制在选择合适数据类型的显示范围值. ...