迷宮 dfs
阿新 • • 發佈:2019-02-11
1791: 演算法3-3:迷宮
時間限制: 1 Sec 記憶體限制: 32 MB提交: 11 解決: 9
[提交][狀態][討論版]
題目描述
有一個 10 x 10 的迷宮,起點是‘S’,終點是‘E’,牆是‘#’,道路是空格。一個機器人從起點走到終點。當機器人走到一個通道塊,前面已經沒有路可走時,它會轉向到當前面向的右手方向繼續走。如果機器人能夠過,則留下足跡‘*’,如果走不通,則留下標記‘!’。 下面給出書中的演算法,請你模擬機器人的走法輸出最終的狀態。 圖:迷宮演算法輸入
一個 10 x 10 的二維字元陣列。
輸出
機器人走過的路徑狀態。
樣例輸入
########## #S # # # # # # # # ## # # ### # # # # # # # # # ### ## # ## E# ##########
樣例輸出
##########
#**#!!!# #
# *#!!!# #
#**!!## #
#*### #
#***# #
# #***# #
# ###*## #
## ****#
##########
提示
這道題是資料結構課上的一道題,當時沒做出來,感覺自己編寫佇列的太難了。雖然思路是一樣的。
學弟學妹們大一下學期,很快就會接觸到資料結構了,希望大家多多練練,不要覺得麻煩,我現在就是覺得當時練的少,沒了書很多東西自己敲不出來
暑假訓練,做了搜尋的專題,所以現在拿出來再寫一次,用的是DFS方法
#include <iostream> #include <cstdio> #include <cstring> using namespace std; char map[15][15]; int visti[15][15]; int flag=1; int dir[4][2]= {{0,1},{1,0},{0,-1},{-1,0}}; //每次碰到障礙只能向右,所以順序不能亂; void dfs(int x,int y) { if(map[x][y]=='E') { //到達出口,則輸出路徑 map[x][y]='*'; for(int i=0; i<10; i++) { for(int j=0; j<10; j++) printf("%c",map[i][j]); printf("\n"); } flag=0; //標記符,如果找到出口,則結束DFS; } map[x][y]='*'; visti[x][y]=1; for(int i=0; i<4; i++) { int newx=x+dir[i][0]; int newy=y+dir[i][1]; if(newx<10 && newy>=0 && newy<10 && newy>=0 && flag) //不能超過邊界 if(!visti[newx][newy] && (map[newx][newy]==' ' || map[newx][newy]=='E')) //空白的地方才能走,visti陣列用來標記是否遍歷過,剪枝葉 dfs(newx,newy); } map[x][y]='!';//不能走到,但是遍歷過,所以有置為; } int main() { for(int i=0; i<10; i++) { for(int j=0; j<10; j++) scanf("%c",&map[i][j]); getchar(); //注意換行符要讀掉 } memset(visti,0,sizeof(visti)); for(int i=0; i<10; i++) for(int j=0; j<10; j++) { if(map[i][j]=='S'){ //找到開始的位置 dfs(i,j); break; } } }