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

Posted tangyimin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

来源/分类

 
 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 }

 

以上是关于1027: 逃离迷宫(2018年中南大学研究生复试机试题)的主要内容,如果未能解决你的问题,请参考以下文章

厦门大学2016年硕士研究生复试基本分数线

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

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

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

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

中山大学2016年硕士研究生入学考试复试基本分数线