hdu-1728(贪心&&bfs的灵活运用吧)
链接
[https://vjudge.net/contest/256476#problem/D]
题意
给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地方是障碍,她必须绕行,从迷宫的一个位置,只能走到与它相邻的4个位置中,当然在行走过程中,gloria不能走到迷宫外面去。令人头痛的是,gloria是个没什么方向感的人,因此,她在行走过程中,不能转太多弯了,否则她会晕倒的。我们假定给定的两个位置都是空地,初始时,gloria所面向的方向未定,她可以选择4个方向的任何一个出发,而不算成一次转弯。gloria能从一个位置走到另外一个位置吗?
Input
第1行为一个整数t (1 ≤ t ≤ 100),表示测试数据的个数,接下来为t组测试数据,每组测试数据中,
第1行为两个整数m, n (1 ≤ m, n ≤ 100),分别表示迷宫的行数和列数,接下来m行,每行包括n个字符,其中字符'.'表示该位置为空地,字符'*'表示该位置为障碍,输入数据中只有这两种字符,每组测试数据的最后一行为5个整数k, x 1, y 1, x 2, y 2 (1 ≤ k ≤ 10, 1 ≤ x 1, x 2 ≤ n, 1 ≤ y 1, y 2 ≤ m),其中k表示gloria最多能转的弯数,(x 1, y 1), (x 2, y 2)表示两个位置,其中x 1,x 2对应列,y 1, y 2对应行。
Output
每组测试数据对应为一行,若gloria能从一个位置走到另外一个位置,输出“yes”,否则输出“no”。
Sample Input
2
5 5
...**
*..
.....
.....
....
1 1 1 1 3
5 5
...
*.*.
.....
.....
*....
2 1 1 1 3
Sample Output
no
yes
分析
首先题目输入故意坑人。注意点
因为有转弯限制,你这时候就得贪心了
就是dfs是就尽快能的往同一方向走这就尽可能地减少转弯
但是代码实现的时候有个bug.我后面也是看了别人的才知道自己的错
[https://www.cnblogs.com/qiufeihai/archive/2012/08/27/2659159.html]
讲的很清楚了。需要解释一下关键代码
str ok;
ok.curk=tem.curk+1;
for(int i=0;i<4;i++){
ok.r=tem.r+d[i][0],ok.c=tem.c+d[i][1];
while(ok.r>=1&&ok.r<=n&&ok.c>=1&&ok.c<=m&&ma[ok.r][ok.c]=='.')
{
//即使其他方向的走过了这里,但是从另一个方向走的时候是可以经过这个位置的
if(!vis[ok.r][ok.c])
{//没检测过的点就检测
q.push(ok);
vis[ok.r][ok.c]=1;
}
//即使检测过了我也可以经过这个点往其他方向搜索
ok.r+=d[i][0];
ok.c+=d[i][1];
}
}
完整代码
#include<iostream>
#include<string.h>
#include<queue>
#include<algorithm>
#include<cstdio>
using namespace std;
const int N=110;
char ma[N][N];
bool vis[N][N];
int d[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
//上下左右
int x1,x2,y1,y2,k,n,m;
bool flag;
struct str{
int r,c,curk;
};
void bfs(){
str tem;
memset(vis,0,sizeof(vis));
tem.r=x1,tem.c=y1,tem.curk=-1;
vis[x1][y1]=1;
queue<str> q;
q.push(tem);
while(!q.empty()){
tem=q.front();
q.pop();
if(tem.r==x2&&tem.c==y2&&tem.curk<=k){
flag=1; break;
}
str ok;
ok.curk=tem.curk+1;
for(int i=0;i<4;i++){
ok.r=tem.r+d[i][0],ok.c=tem.c+d[i][1];
while(ok.r>=1&&ok.r<=n&&ok.c>=1&&ok.c<=m&&ma[ok.r][ok.c]=='.')
{
//即使其他方向的走过了这里,但是从另一个方向走的时候是可以经过这个位置的
if(!vis[ok.r][ok.c])
{//没检测过的点就检测
q.push(ok);
vis[ok.r][ok.c]=1;
}
//即使检测过了我也可以经过这个点往其他方向搜索
ok.r+=d[i][0];
ok.c+=d[i][1];
}
}
}
}
int main(){
int t;
//freopen("in.txt","r",stdin);
scanf("%d",&t);
while(t--){
memset(vis,0,sizeof(vis));
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>ma[i][j];
scanf("%d%d%d%d%d",&k,&y1,&x1,&y2,&x2);
flag=0;
bfs();
if(flag)
printf("yes\n");
else printf("no\n");
}
return 0;
}
hdu-1728(贪心&&bfs的灵活运用吧)的更多相关文章
- 逃离迷宫 HDU - 1728(bfs)
逃离迷宫 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- HDU - 1728 逃离迷宫 【BFS】
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1728 思路 BFS 一开始 从开始位置 往四周走 如果能走的话 这个时候 转弯次数都是0 我们的标记不 ...
- HDU 1728 逃离迷宫
[题目描述 - Problem Description] 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,glo ...
- hdu 1728
//hdu 1728 //这个是一道很经典的迷宫题了,思路感觉...取起点和终点,判断连线是否超过n个弯, //先是从起点出发,上下左右四个方向搜索,找到一条路,把那条路的第一个点压入队列 //然后沿 ...
- HDU 1728:逃离迷宫(BFS)
http://acm.hdu.edu.cn/showproblem.php?pid=1728 逃离迷宫 Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有 ...
- hdu - 1728逃离迷宫 && hdu - 1175 连连看 (普通bfs)
http://acm.hdu.edu.cn/showproblem.php?pid=1728 这两道题花了一下午的时候调试,因为以前做过类似的题,但是判断方向的方法是错的,一直没发现啊,真无语. 每个 ...
- hdu 1728 逃离迷宫 bfs记转向
题链:http://acm.hdu.edu.cn/showproblem.php?pid=1728 逃离迷宫 Time Limit: 1000/1000 MS (Java/Others) Mem ...
- hdu 1728 逃离迷宫 bfs记步数
题链:http://acm.hdu.edu.cn/showproblem.php?pid=1728 逃离迷宫 Time Limit: 1000/1000 MS (Java/Others) Mem ...
- hdu 1728 逃离迷宫 BFS加优先队列 DFS()
http://acm.hdu.edu.cn/showproblem.php?pid=1728 题意就是能否在规定的转弯次数内从起点走到终点.刚走时那步方向不算. 只会bfs(),但想到这题需要记录转弯 ...
随机推荐
- 浅谈RNN、LSTM + Kreas实现及应用
本文主要针对RNN与LSTM的结构及其原理进行详细的介绍,了解什么是RNN,RNN的1对N.N对1的结构,什么是LSTM,以及LSTM中的三门(input.ouput.forget),后续将利用深度学 ...
- frame buffer简单应用
现在我们要在LCD上画一个点,我们无法直接对LCD屏进行操作.这时候就需要用到FrameBuffer,Linux可以FrameBuffer这个设备来供用户态进程实现直接写屏.首先我们先简单看一下lin ...
- WPF 中图片的加载 ,使用统一资源标识符 (URI)
在wpf中,设置图片路径有2种方法: 1.xaml文件中,指定路径 <Button Name=" HorizontalAlignment="Right" Verti ...
- spark问题
使用IDEA运行spark程序,除了需要导入spark的一些依赖包之外,还需要注意的是 当启动spark报找不到可执行的hadoop winutils.exe 可已下载相应版本的winutils.ex ...
- [Go] golang互斥锁mutex
1.互斥锁用于在代码上创建一个临界区,保证同一时间只有一个goroutine可以执行这个临界区代码2.Lock()和Unlock()定义临界区 package main import ( " ...
- python学习笔记(十 二)、操作数据库
每一种语言都少不了多数据库进行各种操作. python支持多种数据库.有关python支持的数据库清单,请参阅:https://wiki.python.org/moin/DatabaseInterfa ...
- Archive & Backup 概念
Archive & Backup 提起归档和备份两个词,给人感觉上是相同的概念,就是对指定文件的一个copy而已.archive和backup感觉是相似的,但是他们有着明显的不同de. arc ...
- CSS实现单行、多行文本超出部分显示省略号
单行文本超出,代码如下: css代码: <style> .one{ width:200px; overflow: hidden; text-overflow:ellipsis; whit ...
- js 数组插入和删除处理
function insertArray(arr, val, compare, maxLen) { //返回位置 const index = arr.findIndex(compare) if (in ...
- Android 解决通过自定义设置打开热点后手机搜索不到热点的问题。
开发过程中出现了通过自定义设置打开热点后手机搜索不到热点的问题. 后来通过观看 /data/misc/wifi 目录下的 hostapd.conf 文件,发现是 interface=ap0 d ...