是乙個關於二維迷宮的題目。我們要從迷宮的起點 's' 走到終點 'e',每一步我們只能選擇上下左右四個方向中的乙個前進一格。 'w' 代表牆壁,是不能進入的位置,除了牆壁以外的地方都可以走。迷宮內的 'd' 代表一道上鎖的門,只有在持有鑰匙的時候才能進入。而 'k' 則代表了鑰匙,只要進入這一格,就會自動地拿到鑰匙。最後 '.' 則是代表空無一物的地方,歡迎自在的遊蕩。 本題的迷宮中,起點、終點、門跟鑰匙這四個特殊物件,每乙個恰好會出現一次。而且,此迷宮的四周 (最上面的一行、最下面的一行、最左邊的一列以及最右邊的一列) 都會是牆壁。 請問,從起點到終點,最少要走幾步呢?
輸入的第一行有兩個正整數h, w,分別代表迷宮的長跟寬。接下來的h行代表迷宮,每行有乙個長度恰為w的字串,此字串只包含`'s'`, `'e'`, `'w'`, `'d '`, `'k'`, `'.'`這幾種字元。
請在一行中輸出乙個整數代表答案,如果無法從起點走到終點,請輸出-1。
樣例:輸入:
4 12
wwwwwwwwwwww
w e.w.s..w.kw
w. .d..w....w
ww wwwwwwwwww
輸出:20
**:/*
思路:先看不經過門能不能到達終點,並求出能到達終點距離;
如果經過門也能達到終點,先求出到達鑰匙的距離再求鑰匙到達終點的距離,相加便是經過門到達終點的距離;
最後比較兩種走法哪個距離最短;
自己寫的**太複雜最後也wa了,參考了別人的**。
*/#include
using namespace std;
#define inf 0x3f3f3f3f
struct node
ss,ee,kk;
char g[505][505];
bool vis[505][505];
int dx[4] = ;
int dy[4] = ;
int n,m,ans;
void bfs(node s, node e, bool key)//key表示是否有鑰匙
if(g[x][y] == 'k')
kk.step = next.step+1;
vis[x][y] = 1;
node temp;
temp.x = x;
temp.y = y;
temp.step = next.step + 1;
q.push(temp);}}
}}int main()
ans = inf;
bfs(ss,ee,0);//沒有鑰匙
if(kk.step != -1)
bfs(kk,ee,1);//有鑰匙
if(ans == inf)
printf("-1\n");
else
printf("%d\n",ans);
return 0;
}
迷宮問題(高階)C C
利用廣度優先搜尋來解決迷宮中的最短路徑,需要把佇列稍微做下調整,博主用的順序佇列,也可以用鏈式,鏈式搜尋起來方便些。之前看到有校友用dfs來解決的,但是相對來說演算法複雜度要高些,因為dfs一般用來解決所有路徑數目問題。typedef structsqqueue 直接甩 include includ...
問題 A 迷宮求解問題
時間限制 10 sec 記憶體限制 2048 mb 提交 574 解決 306 提交 狀態 討論版 用乙個m n的矩陣表示迷宮,0和1分別表示迷宮中的通路和障礙。設計乙個程式,對給定的迷宮,求出找到的第一條從入口到出口的通路,或得到沒有通路的結論。我們指定 1 迷宮的入口為矩陣的左上角 1,1 迷宮...
迷宮問題求解(1) 簡單迷宮
標頭檔案 include include include include include maze.h define max 100 typedef struct position datatype typedef struct stack stack void stackinit stack s ...