1027: 逃離迷宮(2018年中南大學研究生復試機試題)
阿新 • • 發佈:2019-03-20
+= class ear name lse 兩種 提交 visit color
提交: 611 解決: 130
[提交] [狀態] [討論版] [命題人:外部導入]
給定一個m × n (m行, n列)的迷宮,迷宮中有兩個位置,PIPI想從迷宮的一個位置走到另外一個位置,當然迷宮中有些地方是空地,PIPI可以穿越,有些地方是障礙,她必須繞行,從迷宮的一個位置,只能走到與它相鄰的4個位置中,當然在行走過程中,PIPI不能走到迷宮外面去。令人頭痛的是,PIPI是個沒什麽方向感的人,因此,她在行走過程中,不能轉太多彎了,否則她會暈倒的。我們假定給定的兩個位置都是空地,初始時,PIPI所面向的方向未定,她可以選擇4個方向的任何一個出發,而不算成一次轉彎。PIPI能從一個位置走到另外一個位置嗎?
第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對應行。
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
輸出
每組測試數據對應為一行,若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年中南大學研究生復試機試題)