1. 程式人生 > >1027: 逃離迷宮(2018年中南大學研究生復試機試題)

1027: 逃離迷宮(2018年中南大學研究生復試機試題)

+= class ear name lse 兩種 提交 visit color

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 }

1027: 逃離迷宮(2018年中南大學研究生復試機試題)