一天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),也無所謂(聳肩),看到搜索很天然的想到座標別告訴我不知道座標是什麼,儘管我也是學了深度搜索才知道的。那就,再科普一下?
往下看
![](http://static.javashuo.com/static/loading.gif)
(圖醜勿噴)其實這很好理解,設出發點(原點?)座標爲(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 }
PS:戳一下↓[關注我]↓再走唄