1027: 逃离迷宫(2018年中南大学研究生复试机试题)

1027: 逃离迷宫

时间限制: 1 Sec  内存限制: 128 MB
提交: 611  解决: 130
[提交] [状态] [讨论版] [命题人:外部导入]

题目描述

PIPI被困在一个迷宫中了!
  给定一个m × n (m行,
n列)的迷宫,迷宫中有两个位置,PIPI想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,PIPI可以穿越,有些地方是障碍,她必须绕行,从迷宫的一个位置,只能走到与它相邻的4个位置中,当然在行走过程中,PIPI不能走到迷宫外面去。令人头痛的是,PIPI是个没什么方向感的人,因此,她在行走过程中,不能转太多弯了,否则她会晕倒的。我们假定给定的两个位置都是空地,初始时,PIPI所面向的方向未定,她可以选择4个方向的任何一个出发,而不算成一次转弯。PIPI能从一个位置走到另外一个位置吗?

输入

  第1行为一个整数t (1 ≤ t ≤ 100),表示测试数据的个数,接下来为t组测试数据,每组测试数据中,

  第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表示PIPI最多能转的弯数,(x1, y1), (x2, y2)表示两个位置,其中x1,x2对应列,y1, y2对应行。

输出

 每组测试数据对应为一行,若PIPI能从一个位置走到另外一个位置,输出“yes”,否则输出“no”。

样例输入

2
5 5
...**
*.**.
.....
.....
*....
1 1 1 1 3
5 5
...**
*.**.
.....
.....
*....
2 1 1 1 3

样例输出

no
yes

来源/分类

2018年中南大学研究生复试机试题

 1 #include<iostream>
 2 #include<cstring>
 3 #include<queue>
 4 using namespace std;
 5 char map[105][105];
 6 int visit[105][105];
 7
 8 int m,n,k;
 9
10 int dx[4]={0,0,1,-1};
11 int dy[4]={1,-1,0,0};
12
13 typedef struct node{
14     int x;
15     int y;
16     int count;
17 };
18
19 queue<node> q;
20
21 bool isCanGo(int x,int y){
22     if(x>=1&&x<=n&&y>=1&&y<=m&&map[x][y]==‘.‘){
23         return true;
24     }
25     return false;
26 }
27
28 void bfs(int x1,int y1,int x2,int y2){
29     int i;
30     node pos1,pos2;
31     pos1.x=x1;
32     pos1.y=y1;
33     pos1.count=-1;
34     q.push(pos1);
35     visit[x1][y1]=1;
36     while(!q.empty()){//这里的搜索关键点在于方向的计数以及不重复遍历,广搜和深搜都可以
37         pos1=q.front();
38         q.pop();//从起点开始出发找一个方向往前走
39         for(i=0;i<4;i++){
40             pos2.x=pos1.x+dx[i];
41             pos2.y=pos1.y+dy[i];
42             while(isCanGo(pos2.x,pos2.y)){//如果该点可以到达
43                 if(visit[pos2.x][pos2.y]==0){//如果没有被访问过就访问
44                     visit[pos2.x][pos2.y]=1;
45                     pos2.count=pos1.count+1;//并没有改变方向 ,只相比出队的点转换了一个方向
46                     q.push(pos2);
47                     if(pos2.x==x2&&pos2.y==y2&&pos2.count<=k){//符合要求到达最终节点
48                         cout << "yes" << endl;
49                         return;
50                     }
51                 }//继续朝这个方向走,直到走不了了再换方向
52                 pos2.x+=dx[i];
53                 pos2.y+=dy[i];
54             }
55         }
56     }
57     cout << "no" << endl;
58     return;
59 }
60
61 int main(){
62     int x1,y1,x2,y2;
63     int t;
64     cin>>t;
65     while(t--){
66         memset(map, 0, sizeof(map));
67         memset(visit, 0, sizeof(visit));
68         while (!q.empty()){
69             q.pop();
70         }
71         cin>>n>>m;
72         for(int i=1;i<=n;i++){
73             for(int j=1;j<=m;j++){
74                 cin>>map[i][j];
75             }
76         }//其中x1,x2对应列,y1, y2对应行,这里对其进行更改一下顺序
77         cin>>k>>y1>>x1>>y2>>x2;
78         if (x1 == x2 && y1 == y2)
79             cout << "yes" << endl;
80         else
81             bfs(x1,y1,x2,y2);
82     }
83     return 0;
84 }

原文地址:https://www.cnblogs.com/tangyimin/p/10566053.html

时间: 2024-10-08 14:14:58

1027: 逃离迷宫(2018年中南大学研究生复试机试题)的相关文章

1021: 机器人走迷宫(2017年中南大学研究生复试机试题 )

1021: 机器人走迷宫 时间限制: 1 Sec  内存限制: 128 MB提交: 339  解决: 71[提交] [状态] [讨论版] [命题人:外部导入] 题目描述 有一个愚蠢的机器人走进一个w*h的迷宫,迷宫里有空地和陷阱.他想要访问迷宫的每个方格,但是它很笨,只会按照指令的方向走.当机器人不能走的时候,也就是下一步会遇到陷阱.迷宫边界或者访问过的格子,它会向右转90度(顺时针旋转90度,不能访问已经访问过的方格,且在原地只转一次,移动后可获得又一次旋转机会).请问这个机器人最多可以经过多

1022: 淘金(2017年中南大学研究生复试机试题 )

1022: 淘金 时间限制: 1 Sec  内存限制: 128 MB提交: 205  解决: 75[提交] [状态] [讨论版] [命题人:外部导入] 题目描述 在一片n*m的土地上,每一块1*1的区域里都有一定数量的金子.这一天,你到这里来淘金,然而当地人告诉你,如果你挖了某一区域的金子,上一行,下一行,左边,右边的金子你都不能被允许挖了.那么问题来了:你最多能淘金多少? 输入 对于每组数据,第一行两个数n,m,表示土地的长和宽(1<=n,m<=200) 接下来n行,每行m个数,表示每个区域

1028: 安全路径(2014年中南大学研究生复试机试题 )

1028: 安全路径 时间限制: 1 Sec  内存限制: 128 MB提交: 228  解决: 96[提交][状态][讨论版] 题目描述 卫斯理小说经常提及外星人,比如蓝血人. 在土星星球有很多城市,每个城市之间有一条或多条飞行通道, 但是并不是所有的路都是很安全的,每一条路有一个安全系数 s,s 是在  0  和1 间的实数 (包括 0 , 1) ,一条从 u 到 v 的通道 P 的安全度为 Safe(P) = s(e1)*s(e2)…*s(ek) e1,e2,ek是P 上的边 ,现在蓝血人

1023: 巨人排队(2017年中南大学研究生复试机试题 )

1023: 巨人排队 时间限制: 1 Sec  内存限制: 128 MB提交: 185  解决: 58[提交] [状态] [讨论版] [命题人:外部导入] 题目描述 巨人国的小学生放假了,老师要给小朋友们排队了.可是这个老师有强迫症,一定要路队上的小朋友按照身高从高到矮排序(也就是排在前面的不能比后面的矮).小朋友呢也很调皮,一旦老师给他排好队就不愿意动了.这个时候小朋友们一个一个的从教室里出来了,每个小朋友一出来老师就要给小朋友安排好位置.请问老师最少要给小朋友排几条路队呢? 输入 对于每组数

1008: 最大连续子序列(2014年中南大学研究生复试机试题 )

1008: 最大连续子序列 时间限制: 1 Sec  内存限制: 128 MB提交: 461  解决: 80[提交] [状态] [讨论版] [命题人:外部导入] 题目描述 给定 K 个整数的序列{ N1,  N2,  ..., NK } ,其任意连续子序列可表示为{ Ni, Ni+1,...,Nj} ,其中1 <= i<= j <= K.最大连续子序列是所有连续子序列中元素和最大的一个,例如给定序列{ -2, 11, -4, 13, -5, -2 } ,其最大连续子序列为{ 11, -4

考研复试机试题(2010)

考研复试机试题(2010) 转载请标明出处:牟尼的专栏 http://blog.csdn.net/u012027907 解答: /* * 描述: 机试题A解答 * 作者: 张亚超 * 博客: 牟尼的专栏 http://blog.csdn.net/u012027907 * 日期: 2014/7/21 */ #include "stdio.h" #define Max 1000 int getEveSum(int num){ //求各位的数字和 int sum = 0; while(num

惠民工程(2013中南大学研究生复试[最小生成树])

惠民工程 CSU - 1264 时限: 1000MS   内存: 131072KB   64位IO格式: %lld & %llu 提交 状态 已开启划词翻译 问题描述点击打开链接 市政府"惠民工程"的目标是在全市n个居民点间之架设煤气管道(但不一定有直接的管道相连,只要能间接通过管道可达即可).很显然最多可架设 n(n-1)/2条管道,然而实际上要连通n个居民点只需架设n-1条管道就可以了.现请你编写程序,计算出该惠民工程需要的最低成本. 输入 测试输入包含若干测试用例.每个测

水仙花数(2013中南大学研究生上机复试题)

1261: 水仙花数 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 633 Solved: 222 [Submit][Status][Web Board] 点击打开链接 Description 春天是鲜花灿烂的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这样定义的:"水仙花数"是指一个三位数,它的各位数字的立方和等于其本身,比如:153=1^3+5^3+3^3.现在要求输出所有在m和n范围内的水仙花数. Input 输入数据

考研复试机试题(2009)

Problem A:请写一个程序,给出指定整数范围[a ,b]内所有的完数,一个数如果恰好等于除它本身外的所有因子之和,这个数就称为完数,例如6是完数,因为6=1+2+3. 输入说明:共一组数据,为两个正整数,分别表示a和b(1<a<b<10^5). 输出说明:指定范围内的所有完数,每个数占一行. 输入样本 1 100 输出样本 6 28 解答: /* * 描述: 机试题A解答 * 作者: 张亚超 * 博客: 牟尼的专栏 http://blog.csdn.net/u012027907 *