给定一个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 ≤ x1, x 2 ≤ n, 1 ≤ y 1, y 2 ≤ m),其中k表示gloria最多能转的弯数,(x 1, y 1), (x 2, y2)表示两个位置,其中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

首先检讨一下自己:要认真读题,不要自大,不要中途放弃,不要怀疑自己。不得不说这道题让我心态奔溃,只是因为我感觉这道题很简单,然而一次次的wa让我失去了原有的信心。今天下了大雪,我早上写的这道题,感觉一发就过了,然而事与愿违,我又匆匆改了一下,想快点过了,因为室友喊我去打雪仗,然而我还没有过,我渐渐的就急了,当时思绪就乱了,一是因为室友催我,二是我不该因为这样的题而消磨时间,我感觉这就是一种耻辱,我感觉妄为中国人,连这个题就搞不定。可是此时我心态已经炸了,我又交了几发还不过,然后我就放弃了,出去打了波雪仗。玩完吃过饭,又匆匆来写这道题,最后在不断调试下才发现漏洞百出!(不要问我为什么有那么多废话,我只想说,我要让自己记忆深刻一点。以后哪怕是一道a+b的题,我也要用心对待,不能小瞧)我以后将认真面对每道题,我不会放弃,我爱学习。下次再这样,就将十万吨屎塞队友嘴里,就诅咒我今年找不到女朋友,就诅咒室友的孩子没屁眼,我将会铭记这一天,一个白色的周四。好了检讨完毕,开始博客!
第一:要搞清楚坐标系。  很多迷宫中的x,y和数学中的坐标系都是反的,但是这道题说的很清楚,这一点我注意到了,可最后还是搞混了。
第二:标记数组, 标记数组不能用来标记是否走过,而是用来标记走到某点时所用到的转弯次数,假如v[x][y] = 3,表示经过(x,y)这点最优的转弯次数是3,如果接下来又有一个要经过(x,y) 且它的转弯次数是2,那么就要更新v[x][y] = 2然后再重新压入队列。
第三: 判断条件,yes的判断标准是当到达目标点,并且转弯次数<= k ,而no的判断标准是没有yes,所以no只有在整个题图跑完之后才会出现!
具体代码:
#include <queue>
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
int m, n;
int k, x1, y1, x2, y2;
int v[105][105];
char Map[105][105];
int dr[3][3];//表示方向
int d[4][2] = {0, 1, 0, -1, 1, 0, -1, 0};
struct node{int d;   //上次的方向 int numd;//转弯次数 int x, y;
}pre, nex;void init() {dr[0][1] = 1;//-1 0  因为下标不能为-1,所以我将x,y同时加1 dr[2][1] = 2;// 1 0dr[1][0] = 3;//0 -1dr[1][2] = 4;// 0 1memset(v, -1, sizeof(v));
}
bool MAP(int x,int y) {return x>=1 && y>=1 && x<=m && y<=n;
}void bfs() {queue<node> q;while(!q.empty()) q.pop();pre.x = x1;pre.y = y1;pre.d =  0;pre.numd = 0;v[x1][y1] = 0;q.push(pre);while(!q.empty()) {nex = q.front();q.pop();if(nex.x == x2 && nex.y == y2 && nex.numd <= k) { //判断yes printf("yes\n");return ;}for(int i = 0; i < 4; i++) {pre.x = nex.x + d[i][0];pre.y = nex.y + d[i][1];pre.d = dr[d[i][0]+1][d[i][1]+1]; //方向 pre.numd = nex.numd;              //次数 if(MAP(pre.x,pre.y) && Map[pre.x][pre.y] == '.') {if(nex.d != 0 && nex.d != pre.d) //判断 pre.numd = pre.numd + 1;if(v[pre.x][pre.y] == -1 || v[pre.x][pre.y] >= pre.numd) {v[pre.x][pre.y] = pre.numd;q.push(pre);}}}}puts("no"); //如果没有yes  就输出no return ;
}
int main() {int N;scanf("%d",&N);while(N--) {init();scanf("%d%d",&m, &n);for(int i = 1; i <= m; i++)scanf("%s",Map[i]+1);scanf("%d%d%d%d%d",&k, &y1, &x1, &y2, &x2);bfs();}return 0;
}

HDU 1728 逃离迷宫相关推荐

  1. HDU 1728 逃离迷宫(BFS的优化)

    这一题,有两个地方需要注意:(除了题目令人窒息的行列的x y设置) ①转弯如何判断? 需要给转弯的方向赋值.通常,我们在节点向四个方向延伸的时候,喜欢这样 int nextx[4]={0,0,-1,1 ...

  2. hdu 1728 逃离迷宫 (bfs)

    逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  3. hdu 1728 逃离迷宫(dFS+优先队列)

    求转弯最少的走路方式!!!! #include<stdio.h> #include<string.h> #include<queue> using namespac ...

  4. HDU 1728 逃离迷宫【BFS】

    题意:给出一个起点,一个终点,规定的转弯次数,问能否在规定的转弯次数内到达终点--- 这一题是学(看)习(题)的(解)@_@ 主要学了两个地方 一个是剪枝,如果搜到的当前点的转弯次数小于该点turn数 ...

  5. HDU - 1728 逃离迷宫(bfs)

    题目链接:点击查看 题目大意:给出起点和终点和最多的拐弯次数k,问拐弯次数能否在小于等于k的情况下从起点到达终点 题目分析:bfs,不过和以往的不太一样,以往的bfs都是每次加入一个点,而这个题目的限 ...

  6. hdoj 1728 逃离迷宫

    逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  7. HDU ACM 1728 逃离迷宫 (广搜BFS)

    http://acm.hdu.edu.cn/showproblem.php?pid=1728 题意:给出一张图,转弯数k,起点(x1,y1),(x2,y2)判断能不能最多只转k个弯时从起点走到终点 输 ...

  8. hdu 4524 郑厂长系列故事——逃离迷宫

    点击打开链接 郑厂长系列故事--逃离迷宫                                                                               T ...

  9. 逃离迷宫 ( BFS /DFS)

    逃离迷宫 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissi ...

最新文章

  1. 如何设计一个本地缓存
  2. 深度学习在高德的探索与实践
  3. 【Android游戏开发十八】解放手指,利用传感器开发游戏!
  4. oracle insert 数组,oracle 数组 批量insert
  5. mysql group by join_mysql – GROUP BY之后的LEFT JOIN?
  6. 顽皮狗 多线程分享_谁去过顽皮,谁去过尼斯? 圣诞老人为您提供Java 11建议!...
  7. modbus-crc16——c语言
  8. python ip,Python IP处理模块IPy(转载)
  9. .NET Core(C#)使用Titanium.Web.Proxy实现Http(s)代理监控请求的方法及示例代码
  10. 【虚拟机Linux系统】如何将系统语言由英文改成中文?
  11. XMUOJ·纸片选择
  12. Django+Mysql学生选课系统/学分管理系统
  13. call()的具体使用方法
  14. 【SS524 平替 HI3521DV200性能对比表】
  15. 如何在xmd上运行java文件,Junit命令行应用
  16. linux虚拟机之Ubuntu基本使用(3/10)
  17. 经典方法论:麦肯锡解决问题的7个步骤,七步分析法,值得学习!
  18. 新能源汽车屡着火,AIoT提供了保命招
  19. three.js创建地球带大气层、辉光、云层、凹凸、高光
  20. 学计算机会设置路由器,腾达无线路由器怎么设置? 路由设置图解

热门文章

  1. PIC单片机中断服务程序
  2. pandaboard Rev b3 刷boot和android系统
  3. 软件缺陷分析-软件测试之犯罪心理学
  4. 华为数据通信的“全联接”谋略:支撑千行百业数字化转型
  5. 量化分析(8)——唐安奇通道
  6. mysql禁用空密码登录_允许phpmyadmin 空密码登陆
  7. 蓝桥杯真题 ——单词分析(python3)
  8. linux cs go鼠标灵敏度,CSGO鼠标调试方法 选择适合自己的鼠标速度
  9. 抖音账号和视频都没问题,为什么投放不了DOU+呢?丨国仁网络资讯
  10. 离线包打包工具使用说明