给定一个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
这个题目在搜索题目中应该是一个比较难的题目了,做法就是讲BFS当DFS用
传统的BFS一般情况下用来计算从一个点到另外一个点的最短路径之类的问题,但是这个题目让求最短的转弯次数,思路就是 沿着一个方向一致走 ,我遍历完该方向的所有点,当与到终点是直接输出转弯次数。
AC代码:
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
struct stu{
int a,b,c;//分别指点的坐标与当前转弯次数
}e1,e2,e3;
int d[][]={{,},{,},{-,},{,-}};//四个方向,一定要对四个方向中,沿着每一个方向走,, 直到撞墙
int mark[+][+];
char arr[+][+];
int n,m;
int k,x1,y1,x2,y2; int bfs(){
queue<stu>que;
que.push({x1,y1,-});//初始转弯为-1,因为第一次转弯不计数
mark[x1][y1]=;//初识标记 while(que.size()){
int xx=que.front().a;
int yy=que.front().b;
int zz=que.front().c;
que.pop();
if(zz>=k) break;//这里为什么直接跳出呢,因为我们用bfs队列中存储的都是最少的转弯次数,如果转弯次数为k但是没有到终点,以后的转弯次数只会越来越来大,所以要跳出 for(int i=;i<;i++){
int dx=xx+d[i][];
int dy=yy+d[i][];
int cnt=zz+;//转弯次数加一,每一个方向Zz是不变的,,所以在每个方向cnt是相等的
while(){//一直走
if(dx>=&&dx<=n&&dy>=&&dy<=m&&arr[dx][dy]=='.')//判断越界等
{
if(dx==x2&&dy==y2)//终点直接输出,,不用判断转弯次数,因为我们前边加了个if(zz>=k) break;所以cnt最大为k
{
return ;
}
if(mark[dx][dy]==){
mark[dx][dy]=;
que.push({dx,dy,cnt});
}
dx=dx+d[i][];//因为一直沿着i这个方向走,所以只改变dx与dy的值就好了
dy=dy+d[i][];
}
else break;
}
}
}
return ;
} int main()
{
int t;
cin>>t;
while(t--){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++){
cin>>arr[i][j];
}
scanf("%d%d%d%d%d",&k,&y1,&x1,&y2,&x2);
memset(mark,,sizeof(mark));
if(bfs())
puts("yes");
else puts("no");
}
return ;
}
												

最新文章

  1. ios之json,xml解析
  2. svn状态图标大全
  3. Google Code jam Qualification Round 2015 --- Problem A. Standing Ovation
  4. JUC回顾之-CyclicBarrier底层实现和原理
  5. Flex 教程(1)-------------控件拖动
  6. linux 配置apache+subversion
  7. 每天一道算法_6_I Think I Need a Houseboat
  8. Android url中文编码问题
  9. 【剑指offer】的功率值
  10. PyCharm出现TabError: inconsistent use of tabs and spaces in indentation最简单实用的解决办法
  11. vim常用命令集
  12. grpc 使用流程、使用技巧
  13. Ubunt 使用Virtualbox虚拟机NAT无法上网解决办法
  14. 【Hadoop 分布式部署 三:基于Hadoop 2.x 伪分布式部署进行修改配置文件】
  15. JS中取得&lt;asp:TextBox中的值
  16. JS获取浏览器URL中查询字符串的参数
  17. [源码分析]ArrayList
  18. php 不依赖数据实现删除图片,核心代码
  19. 【剑指offer12】矩阵中的路径(回朔法),C++实现
  20. kalman 滤波 演示与opencv代码

热门文章

  1. 单调栈-Maximum Width Ramp
  2. 「面试指南」JS数组Array常用算法,Array算法的一般解答思路
  3. FormDataMultiPart获取表单文件的大小
  4. 使用Keras进行深度学习:(五)RNN和双向RNN讲解及实践
  5. 【python系统学习11】循环语句里的F4
  6. IOS 手动添加第三方库报错问题
  7. [vijos]1066弱弱的战壕&lt;线段树&gt;
  8. 宝塔phpmyadmin可能问题及解决方法
  9. CentOS 6.5 nginx+tomcat+ssl配置
  10. JS数据结构与算法 - 二叉树(一)基本算法