1. 程式人生 > >迷宮 dfs

迷宮 dfs

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;
            }
        }

}