迷宮

原題粘貼:

1215:迷宮


時間限制: 1000 ms         內存限制: 65536 KB
提交數: 13252     經過數: 3886 

【題目描述】

一天Extense在森林裏探險的時候不當心走入了一個迷宮,迷宮能夠當作是由n * n的格點組成,每一個格點只有2種狀態,.和#,前者表示能夠通行後者表示不能通行。同時當Extense處在某個格點時,他只能移動到東南西北(或者說上下左右)四個方向之一的相鄰格點上,Extense想要從點A走到點B,問在不走出迷宮的狀況下能不能辦到。若是起點或者終點有一個不能通行(爲#),則當作沒法辦到。ios

【輸入】

第1行是測試數據的組數k,後面跟着k組輸入。每組測試數據的第1行是一個正整數n (1 ≤ n ≤ 100),表示迷宮的規模是n * n的。接下來是一個n * n的矩陣,矩陣中的元素爲.或者#。再接下來一行是4個整數ha, la, hb, lb,描述A處在第ha行, 第la列,B處在第hb行, 第lb列。注意到ha, la, hb, lb所有是從0開始計數的。數組

【輸出】

k行,每行輸出對應一個輸入。能辦到則輸出「YES」,不然輸出「NO」。測試

【輸入樣例】

2
3
.##
..#
#..
0 0 2 2
5
.....
###.#
..#..
###..
...#.
0 0 4 0

【輸出樣例】

YES
NO


很典型的搜索回溯題(DFS),若是非要廣度優先搜索(BFS),也無所謂(聳肩),看到搜索很天然的想到座標別告訴我不知道座標是什麼,儘管我也是學了深度搜索才知道的。那就,再科普一下?

往下看

 



 (圖醜勿噴)其實這很好理解,設出發點(原點?)座標爲(0,0),那麼這個往右走一步即是(0,-1),往上走是(1,0)往右走是(0,1),向下即是(1,0)就是在相應的方向上對於x和y進行加1或減1處理spa


科普完畢3d

那麼,瞭解了座標後,就能夠得出一下兩個表示座標的數組:code

1 int dx[4]={0,1,0,-1},
2     dy[4]={1,0,-1,0}

 

而後就是輸入預處理,將每組數據的地圖進行初始化,用0,1表示能不能走以及有沒有走過(要注意,若是出發點就是不能走的,直接退出便可,沒必要進行遞歸Dfs),同時,添加一個Flag判斷數據是否有解,如有解,輸出「YES」,不然一概「NO"(每次輸入的地圖都須要更新map中的0,1的狀況):blog

 1 cin>>n;  2     while (n--){  3         
 4         cin>>m;  5         memset(boo_map,true,sizeof(boo_map));//初始化地圖  6         flag=false;  7         for(int i=0;i<m;i++)  8            for(int j=0;j<m;j++){  9                cin>>chr; 10                   if(chr=='#')boo_map[i][j]=false;//標註不能走的地方 11  } 12         cin>>x1>>y1>>x2>>y2; 13  Dfs(x1,y1); 14         if(!flag)cout<<"NO"<<endl;//無解輸出」NO" 15     }

接下來就是最重要的搜索(Dfs),也就是本題的核心:遞歸

1. 判斷最終是否抵達終點,若抵達,輸出「YES",Flag變爲1,跳出遞歸程序段內存

2. 若不知足條件,枚舉四個方向(即dx&dy),依次用當前座標x,y去加,若知足邊界條件(即:x+dx[i]>=0&&x+dx[i]<m&&y+dy[i]>=0&&y+dy[i]<m&&boo_map[x+dx[i]][y+dy[i]])ci

3. 將走過的路設爲0

4. 遞歸下一層

5. 回溯(能夠不回溯)

即可得:

 1 void Dfs(int x,int y){  2     
 3     if(x==x2&&y==y2){//1  4         cout<<"YES"<<endl;  5         flag=true;  6         return ;  7  }  8     else
 9     for(int i=0;i<4;i++){//2 10         if(x+dx[i]>=0&&x+dx[i]<m&&y+dy[i]>=0&&y+dy[i]<m&&boo_map[x+dx[i]][y+dy[i]]){ 11             boo_map[x+dx[i]][y+dy[i]]=false;//3 12             Dfs(x+dx[i],y+dy[i]);//4 13  } 14  } 15     
16 }

整合一下,即可以AC啦!

 

Code防做弊系統已添加

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;  5 int dx[4]={0,1,0,-1},  6     dy[4]={1,0,-1,0};  7 bool boo_map[1000][1000]={true},flag=false;  8 int m,n;  9 int x1,x2,y1,y2; 10 void Dfs(int x,int y){ 11     
12     if(x==x2&&y==y2){ 13         cout<<"YES"<<endl; 14         flag=true; 15         return ; 16  } 17     else
18     for(int i=0;i<4;i++){ 19         if(x+dx[i]>=0&&x+dx[i]<m&&y+dy[i]>=0&&y+dy[i]<m&&boo_map[x+dx[i]][y+dy[i]]){ 20             boo_map[x+dx[i]][y+dy[i]]=false; 21             Dfs(x+dx[i],y+dy[i]); 22  } 23  } 24     
25 } 26 
27 int main(){ 28     int n; 29     char chr; 30     cin>>n; 31     while (n--){ 32         
33         cin>>m; 34         memset(boo_map,true,sizeof(boo_map)); 35         flag=false; 36         for(int i=0;i<m;i++) 37            for(int j=0;j<m;j++){ 38                cin>>chr; 39                   if(chr=='#')boo_map[i][j]=false; 40  } 41         cin>>x1>>y1>>x2>>y2; 42  Dfs(x1,y1); 43         if(!flag)cout<<"NO"<<endl; 44  } 45     
46 }

 

THE END

 

PS:戳一下↓[關注我]↓再走唄

相關文章
相關標籤/搜索