hdu1242 DFS基础(回溯的重要性)
题目大意:在迷宫里从a出发走到r,每走一格时间+1,但是遇到x时间还要额外+1,求最短的时间。
题解:直接dfs把每一个格子都走一遍,设置一个时间参数,走一格就+1,还要注意回溯和剪枝。
很多新手都会疑惑,回溯有什么用呢?回溯的作用就是在分叉口时你选择了这一条路,往这条路一直走不可回头(用访问数组标记走过的路),走到尽头时,你重新回到那个分叉口(访问数组取消标记),你上一次走的路对于你现在来说是没有走过的,dfs过程中有许多分叉口,所以要用回溯才能走遍每一条路。
具体思路看代码以及注释
#include<iostream>
#include<cstring>
using namespace std;
int dir[][]={,,,-,,,-,};//四个方向
char a[][];
int minn,v[][],n,m;
void dfs(int x,int y,int sum)
{
if(a[x][y]=='#')//遇到墙不走
return;
if(a[x][y]=='r')//走到了终点
{
if(sum<minn)//记录最小值
minn=sum;
return;
}
for(int i=;i<;i++)//枚举四个方向
{
int xx=x+dir[i][];
int yy=y+dir[i][];
if(a[xx][yy]=='x'&&!v[xx][yy]&&xx>=&&xx<n&&yy>=&&yy<m)//将路径限制在n*m之内
{
v[xx][yy]=;//标记要走的路
dfs(xx,yy,sum+);
v[xx][yy]=;//走遍之后回溯 ,以便下次经过时还能通过
}
else if(a[xx][yy]!='x'&&!v[xx][yy]&&xx>=&&xx<n&&yy>=&&yy<m)
{
v[xx][yy]=;//同上
dfs(xx,yy,sum+);
v[xx][yy]=;
}
}
}
int main()
{
int sx,sy;
while(cin>>n>>m)
{
for(int i=;i<n;i++)
{
for(int j=;j<m;j++)
{
cin>>a[i][j];
if(a[i][j]=='a')
{
sx=i;sy=j;
}
}
}
minn=;
memset(v,,sizeof(v));
dfs(sx,sy,);
if(minn==)//如果minn为改变说明没找到
cout<<"Poor ANGEL has to stay in the prison all his life."<<endl;
else
cout<<minn<<endl;
}
return ;
}
hdu1242 DFS基础(回溯的重要性)的更多相关文章
- 洛谷1378 油滴扩展 dfs进行回溯搜索
题目链接:https://www.luogu.com.cn/problem/P1378 题目中给出矩形的长宽和一些点,可以在每个点放油滴,油滴会扩展,直到触碰到矩形的周边或者其他油滴的边缘,求出剩余面 ...
- 算法与数据结构基础 - 回溯(Backtracking)
回溯基础 先看一个使用回溯方法求集合子集的例子(78. Subsets),以下代码基本说明了回溯使用的基本框架: //78. Subsets class Solution { private: voi ...
- hdu-1242 dfs+各种剪枝
思路: 可以和1010一个思路.这个抽象的说就是让你求给定图中两点的最短距离,其实dfs的题目能变化的地方就在“终点的回溯处”,在我们到达终点后,再判断一些附加的值(本题里是最短距离是否更新),从而得 ...
- POJ 3050 Hopscotch【DFS带回溯】
POJ 3050 题意: 1.5*5的方阵中,随意挑一格,记住这个格子的数字 2.可以上下左右走,走5次,每走一次记录下所走格子的数字 3.经过以上步骤,把所得6个数字连起来,形成一串数字.求共可以形 ...
- 【dfs基础讲解及例题】
定义 DFS(Depth-First-Search)深度优先搜索算法,是搜索算法的一种. 接下来因为懒得去找大段大段深奥的材料 所以就是一些个人的理解. 所谓深搜,是相对于广搜(只是第一篇)来说的.深 ...
- 搜索(BFS、DFS、回溯)
这类题是最简单的了都是一个套路,不像动态规划一类题一个套路,没做过就是不会也极难想出来. 一.BFS 解决的问题:用来初始点解决到指定点的最短路径问题,因为图的每一层上的点到初始点的距离相同.(注意是 ...
- leetcode 357. 计算各个位数不同的数字个数(DFS,回溯,数学)
题目链接 357. 计算各个位数不同的数字个数 题意: 给定一个非负整数 n,计算各位数字都不同的数字 x 的个数,其中 0 ≤ x < 10n . 示例: 输入: 2 输出: 91 解释: 答 ...
- DFS基础题
hdu 1241 油田 裸DFS 题意:@代表油田 8个方向上还有@就相连 相当于求图中连通子图的个数Sample Input1 1 // n m*3 5*@*@***@***@*@*1 8@@** ...
- 深搜(DFS),回溯,Fire Net
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=2 解题报告: 这里的深搜有一点不同,就是,在深搜每一个点时,都要深搜每 ...
随机推荐
- jquery各版本
各版本下载: https://www.jb51.net/zt/jquerydown.htm
- linux下压缩解压缩命令
zip/gzip 命令 linux zip命令参数列表: -a 将文件转成ASCII模式 -F 尝试修复损坏的压缩文件 -h 显示帮助界面 -m 将文件压缩之后,删除源文件 -n 特定字符串 ...
- css学习_cs3s旋转的图片
1. ,鼠标移开后图片面向屏幕后又自动可见了. 2.css3动画 !!定义好动画后再引用 4.多组动画(百分比) 案例: 案例2----无缝滚动
- django上传excel文件
def uploadGrade(request): ''' 班级信息导入 :param request: :return: ''' if request.method == 'POST': f = r ...
- yii2 gridview checkbox
给checkbox(在GridView里的)添加一个value 控制器:$dataProvidermStu->key = "student_no"; view:[ 'clas ...
- cmd中mysql主键id自增,在添加信息时发生错误,再次成功添加时,id已经跳过错误的信息继续自增。
id 自增,在往这个表里添加信息时 发生错误,再次添加 id数值已经跳过之前
- springboot+rediscluster
@EnableCaching @Configuration public class RedisConfiguration extends CachingConfigurerSupport { @Au ...
- 学习ActiveMQ(五):activemq的五种消息类型和三种监听器类型
一.前面我们一直发送的是字符串类型,其实activemq一共支持五种消息类型: 1.String消息类型:发送者:消费者: 1.String消息类型:发送者:消费者: 1.String消息类型:发送者 ...
- 用web技术写APP
_ 听说会写web的人也能写APP, 抱着尝试的心态踏上路体验一番 http://www.ionic.wang/start-index.html 0x00 框架环境介绍 ionic是什么? https ...
- Asp.net 使用线程池实例
实际开发经常会使用线程,如果每次使用都是创建线程.启动线程,然后销毁线程,从性能上来讲,非常占用系统开销,当线程达到一定量的时候会影响程序的运行和处理效率. 使用线程池:好处:线程池是一种多线程处理形 ...