DFS(5)——hdu1728逃离迷宫
一、题目回顾
题目链接:逃离迷宫
第1行为两个整数m, n (1 ≤ m, n ≤ 100),分别表示迷宫的行数和列数,接下来m行,每行包括n个字符,其中字符'.'表示该位置为空地,字符'*'表示该位置为障碍,输入数据中只有这两种字符,每组测试数据的最后一行为5个整数k, x1, y1, x2, y2 (1 ≤ k ≤ 10, 1 ≤ x1, x2 ≤ n, 1 ≤ y1, y2 ≤ m),其中k表示gloria最多能转的弯数,(x1, y1), (x2, y2)表示两个位置,其中x1,x2对应列,y1, y2对应行。
二、解题思路
- 据说是经典BFS
- DFS+剪枝
- 转弯数
三、代码
//dfs+剪枝
//根据下一点如果遍历过而且转弯数小于当前点到达下一点的转弯数(其他情况类似)进行剪枝
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn = 1e4+;
#define INF 0x3f3f3f3f
char a[][];
int n,m,k,T,x1,y1,x2,y2; //起点坐标(is,js),门的坐标(id,jd)
int to[][]={,,-,,,,,-};
int vis[][]; //记录到达某点所需的转弯数
bool flag; void dfs(int x,int y,int dir) //cnt为当前转弯的次数
{
int mx,my;
if(x==x2 && y==y2){
if(vis[x][y]<=k)
flag = ;
return;
}
if(vis[x][y]>k) return; //大于k时已晕,不行
//如果(x,y)和终点(x2,y2),既不在同一行也不在同一列,那么要想到终点至少需要转一次,但现在已经转够k次了,故不行
if(vis[x][y]==k && x!=x2 && y!=y2) return;
for(int i=;i<;i++){
mx = x + to[i][];
my = y + to[i][];
if(mx< || mx>m || my< || my>n) continue;
if(vis[x][y]>vis[mx][my] || a[mx][my]=='*') continue; //这里相等的情况不能剪掉
//这条if和上面的差不多,目的是:如果从(x,y)走一步到(tx,ty)需要转一次话,并且转过之后vis[x][y]+1依然比vis[tx][ty]大的话,也不符合
if(dir!=- && i!=dir && vis[mx][my]<vis[x][y]+) continue;
vis[mx][my] = vis[x][y];
if(dir!=- && i!=dir){
vis[mx][my]++;
}
dfs(mx,my,i);
if(flag==)
return;
}
} int main()
{
cin>>T;
while(T--){
scanf("%d%d",&m,&n);
for(int i=;i<=m;i++){
getchar();
for(int j=;j<=n;j++){
scanf("%c",&a[i][j]);
}
}
getchar();
cin>>k>>y1>>x1>>y2>>x2; //注意,这里是先接y,再接x
memset(vis,INF,sizeof(vis)); //因为在dfs()中剪枝要去最小的转弯次数,所以vis要初始化成最大
vis[x1][y1] = ; //转0次弯
flag = ;
dfs(x1,y1,-);
if(flag==) printf("yes\n");
if(flag==) printf("no\n");
}
return ;
}
DFS(5)——hdu1728逃离迷宫的更多相关文章
- 深度优先搜索(DFS),逃离迷宫
[原创] 今天来说说深度优先搜索,深度优先是图论中的内容,大意是从某一点出发,沿着一个方向搜索下去,并伴随着有回退的特点,通常用来判断某一解是否存在,不用来寻找最优解:这里来看一个非常有意思的题目: ...
- Hdu1728 逃离迷宫 2017-01-17 10:56 81人阅读 评论(0) 收藏
逃离迷宫 Time Limit : 1000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submissi ...
- hdu1728 逃离迷宫
给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地方是障碍,她必须绕行,从迷宫的一个位 ...
- hdu1728逃离迷宫 (利用最短路径思想+优先队列(BFS))
Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有 ...
- hdu1728 逃离迷宫---转弯次数不超过k+BFS
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1728 题目大意: 给你一幅图,给出起点终点和最大转弯次数,判断是否能从起点到终点.'*'表示障碍物. ...
- hdu1728 逃离迷宫bfs
题目链接:http://icpc.njust.edu.cn/Problem/Hdu/1728/ 关于广度优先搜索的第一篇题解.广度优先搜索,就是状态树的层次遍历,一层一层的搜索,直到搜索到目标状态为止 ...
- hdu 1728:逃离迷宫(DFS,剪枝)
逃离迷宫 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- HDU 1728 逃离迷宫(DFS||BFS)
逃离迷宫 Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可 ...
- HDU 1728 逃离迷宫(DFS)
题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=1728 题目: 逃离迷宫 Time Limit: 1000/1000 MS (Java/Others) ...
随机推荐
- HTML5--应用网页模板
因为刚开始写博客,只想着把知识点记录在这,也想给你们一些参考,在布局上有些没有思考太多;回过头来看,实在是不忍直视,对不住之前阅读的100+,既然昨天的事无法挽回,那就从现在开始从新整改吧!也希望大家 ...
- Object C学习笔记20-结构体(转)
在学习Object C中的过程中,关于struct的资料貌似非常少,查阅了C方面的资料总结了一些学习心得! 一. 定义结构 结构体是一种数据类型的组合和数据抽象.结构体的定义语法如下: struct ...
- php mysql 计算经纬之间距离 范围内筛选
<?php /** * 根据经纬度和半径计算出范围 * @param string $lat 纬度 * @param String $lng 经度 * @param float $radius ...
- 重新格式化hadoop的namenode导致datanode无法启动的最简单解决办法
一般namenode只格式化一次,重新格式化不仅会导致之前的数据都不可用,而且datanode也会无法启动.在datanode日志中会有类似如下的报错信息: java.io.IOException: ...
- 详解Linux运维工程师
运维工程师是从一个呆逼进化为苦逼再成长为牛逼的过程,前提在于你要能忍能干能拼,还要具有敏锐的嗅觉感知前方潮流变化.如:今年大数据,人工智能比较火……(相对表示就是 Python 比较火) 之前写过运维 ...
- thinkphp5 分页带参数的解决办法
文档有说可以在paginate带参数,然后研究了下,大概就是这样的: $list=Db::name('member') ->where('member_name|member_mobile|se ...
- css公共类
/*iOS弹性滚动*/ .scrolling{ position: absolute; width: 100%; height:100%; overflow-x:hidden; overflow-y: ...
- 在pythonanywhere上部署Django应用
参考:https://tutorial.djangogirls.org/zh/deploy/ 资料讲的很明了,仅在设置上做几点补充. 1.设置相对路径 import os BASE_DIR = os. ...
- Python全栈day 02
Python全栈day 02 一.循环语句 while 用法 num = 1 while num <= 10: print(num) num += 1 # 循环打印输出1-10 while el ...
- Python学习 :格式化输出
方式一:使用占位符 % 常用占位符:% s (s = string 字符串) % d (d = digit 整数(十进制)) % f ( f = float 浮点数) na ...