给定一个 m×n (m 行, n 列)的迷宫,迷宫中有两个位置,gloria 想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria 可以穿越,有些地方是障碍,她必须绕行,从迷宫的一个位置,只能走到与它相邻的 4 个位置中,当然在行走过程中,gloria 不能走到迷宫外面去。令人头痛的是,gloria 是个没什么方向感的人,因此,她在行走过程中,不能转太多弯了,否则她会晕倒的。我们假定给定的两个位置都是空地,初始时,gloria 所面向的方向未定,她可以选择 4 个方向的任何一个出发,而不算成一次转弯。gloria 能从一个位置走到另外一个位置吗?输入格式
第 1 行为一个整数 T,表示测试数据的个数,接下来为 T 组测试数据,每组测试数据中,第 1 行为两个整数 m,n,分别表示迷宫的行数和列数,接下来 m 行,每行包括 n 个字符,其中字符 . 表示该位置为空地,字符 * 表示该位置为障碍,输入数据中只有这两种字符,每组测试数据的最后一行为 5 个整数 k,x1,y1,x2,y2,其中 k 表示 gloria 最多能转的弯数,(x1,y1),(x2,y2) 表示两个位置,其中 x1,x2 对应列,y1,y2 对应行。输出格式
每组测试数据对应为一行,若 gloria 能从一个位置走到另外一个位置,输出 yes,否则输出 no。数据范围
1≤T≤100,
1≤m,n≤100,
1≤k≤10,
1≤x1,x2≤n,
1≤y1,y2≤m,
保证给定的两个位置不同,且一定是空地。输入样例:
2
5 5
...**
*.**.
.....
.....
*....
1 1 1 1 3
5 5
...**
*.**.
.....
.....
*....
2 1 1 1 3
输出样例:
no
yes

经典的floodfill模型

一开始选定一个方向,然后按照那个方向一直走如果越界或者遇到障碍物的话就换路走

难点是如何统计拐点

方法就是开一个dist二维数组用于记录走到这个位置最少需要变化几次方向

#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
const int N=120;
typedef pair<int,int>PII;char g[N][N];
int dist[N][N];
bool st[N][N];
int n,m;
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};//偏移量,枚举四个方向bool bfs(int sx,int sy,int ex,int ey,int k)
{queue<PII>q;q.push({sx,sy});st[sx][sy]=true;while(q.size()){auto t=q.front();q.pop();if(t.x==ex&&t.y==ey)break;for(int i=0;i<4;i++)//枚举四个方向{int nx=t.x+dx[i],ny=t.y+dy[i];while(nx>=1&&ny>=1&&nx<=n&&ny<=m&&g[nx][ny]=='.')//按照这个方向一直走{if(!st[nx][ny])//没有被访问的话放入队列中,并且更新dist的值{dist[nx][ny]=dist[t.x][t.y]+1;st[nx][ny]=true;q.push({nx,ny});}nx+=dx[i],ny+=dy[i];//让他走下一个格子}}}if(dist[ex][ey]==0||dist[ex][ey]>k+1)return false;//如果当前dist为0说明没有被访问//如果dist大于k+1则说明不能通过return true;
}int main()
{int T;cin>>T;while(T--){cin>>n>>m;memset(st,0,sizeof st);memset(dist,0,sizeof dist);for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)cin>>g[i][j];int k,x1,x2,y1,y2;cin>>k>>y1>>x1>>y2>>x2;if(bfs(x1,y1,x2,y2,k))puts("yes");else puts("no");}return 0;
}

逃离迷宫 c++ bfs(中南大学考研机试题相关推荐

  1. 从头开始学算法:考研机试题练习(C/C++)–STL使用

    从头开始学算法:考研机试题练习(C/C++)–STL使用 最近重学C语言,刷的是胡凡写的<算法笔记>,这本书的题主要是面向考研机试和一般算法考试的,零基础入门,还不错,在此记录学习过程. ...

  2. 从头开始学算法:考研机试题练习(C/C++)–算法初步

    从头开始学算法:考研机试题练习(C/C++)–算法初步 最近重学C语言,刷的是胡凡写的<算法笔记>,这本书的题主要是面向考研机试和一般算法考试的,零基础入门,还不错,在此记录学习过程. 本 ...

  3. 2020年华科计算机考研机试题答案(没弄懂题目的意思)

    2020年华科研究生复试机试题,包含测试数据和题目,里面是文档和要所报文件.供考研学子学习使用.此数据量有点大,涉及到链表,数据转换,和容器.以下代码都是我写的,欢迎交流.原题目和测试文档链接地址是[ ...

  4. 逃离迷宫 ( BFS /DFS)

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

  5. 日期累加(北京理工大学考研机试题)

    文章目录 日期累加 日期类问题必备函数 AC代码 日期累加 本题链接:日期累加 本博客给出本题截图: 日期类问题必备函数 const int months[13] = {0, 31, 28, 31, ...

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

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

  7. 西工大计算机考研机试题练习(2019年-2014年)

    nwpu复试上机题练习 2019年 1.排序@@ #include "iostream" #include "set" using namespace std; ...

  8. HDU 1728 逃离迷宫【BFS】

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

  9. 2021年上海交通大学计算机系考研机试题

    三个题全是Leetcode原题,按照考场老师的说法今年的机试算是简单的了 674. 最长连续递增序列 leecode原题 https://leetcode-cn.com/problems/longes ...

最新文章

  1. 北大教授张大庆:无线感知,让你变老也优雅
  2. MySQL的约束、多表查询、子查询
  3. Dataset之babyboom.dat:babyboom.dat数据集的简介、安装、使用方法之详细攻略
  4. 开机直接进入键盘布局_不要亏待了你的手指,这款无线机械键盘了解一下
  5. 【spring boot】使用RestTemplate调用百度坐标转换服务
  6. Codeforces Round #726 (Div. 2) E2. Erase and Extend (Hard Version) 贪心
  7. 用户控件事件使用delegate
  8. MySQL 5.0 新特性教程 触发器:第一讲
  9. 4.19计算机网络笔记
  10. java excel导入前台_java后台生成了一个表格,用流传到前台,请问怎么接收呀?在线等...
  11. 赛前集训前的总结(警醒)
  12. linux-系统资源查看-动态
  13. matlab配置vlfeat库(0.9.21)
  14. word文档 文献尾注修改样式
  15. 使用谷歌地图拾取异国坐标
  16. 电脑CPU的最佳工作温度是多少度
  17. PAT 甲级 1118 Birds in Forest (25 分)
  18. 常用PHP开发工具都有哪些(2021整理)
  19. Quake1和2的pak资源文件格式说明
  20. 对话机器人在瓜子的实践

热门文章

  1. SWOOSH数据下载
  2. 监控属于计算机应用的,实时监控
  3. ARM M3/M4单片机jlink连不上的原因
  4. 我和TiDB的故事 | 遇上你是我的缘
  5. 互联网电商大厂的分布式事务使用案例
  6. Kaldi运行thchs30中文语音识别教程
  7. 前端工程师和后端工程师的区别?
  8. 不添一分钱 轻松使用无盘WIN2000(转)
  9. 瑞博奥IPO过会:年营收2.85亿 黄若磐家族均为美国籍
  10. 微信支付银行卡限额是多少?