BFS 皇宮VS迷宮

2021-08-04 23:32:46 字數 2989 閱讀 1290

問題描述

fish 社會還是封建制度,皇帝是最高統治者,皇宮作為皇帝吃喝完樂的場所,警衛森

嚴,一般人一旦進入,就很難活著出來。與其說它是個皇宮,還不如說他是個迷宮。

這個巨大的迷宮花費了無數蠢得要死的fish 的辛勤勞動建成,因此結構極其複雜,而

且到處機關重重。下面就來看看迷宮的構造:

首先它是由n*m 個格仔構成的矩形區域。有的格仔是石頭,無法穿越(黃色部分);而

有的格仔是水(白色部分),水中如果沒有管道(彩色長條),則fish 可以在裡面自由式;

但在一些水中可能存在連線上下或左右兩個格仔的管道,fish 不能逗留在有管道的格仔裡,

但是可以從乙個縱向的管道的下面那個格仔、穿過這個管道、遊到管道上面的那個格仔,前

提是這兩個格仔都不是石頭。同樣也可以反過來遊,橫向的管道也是類似的。任何管道所在

格仔都不相鄰。

某些格仔中還存放有一些管道的鑰匙,一旦得到某片鑰匙時,就可以改變與之對應的管

道(圖中顏色相等)的方向,前提是先游到管道所在格的相鄰格仔(上下左右共邊的格仔為

相鄰格)。一旦fish 遊到乙個格仔,fish 就會用最快速度搜尋一遍這個格仔和上下左右相

鄰的格仔,然後把在格中找到的鑰匙當作寶貝一樣的吞進肚子裡(要用的時候再吐出來)。

乙個格仔中可能沒有鑰匙,但不可能有多片鑰匙。迷宮中僅存在乙個出口,fish 到那一格

就可以重見天日。

如果有鑰匙,旋轉管道是十分快捷的,四肢發達的fish(雖然似乎沒有四肢)將不費

吹灰之力迅速的改變某個管道的方向,前提是獲得了那個管道的對應鑰匙。每乙個時刻fish

可以從乙個格仔遊到上下左右相鄰的另乙個格仔(前提:不能遊到石頭裡,也不能有管道),

或者穿過某個相鄰格的管道達到乙個距離為2 的格仔(上上、下下、左左、右右4 個格仔),

當然也不能為石頭或管道。

為了防止其他進入迷宮的人探索出迷宮的出路,迷宮有一種高階自動關閉系統,當它檢

測到一條fish 進入到迷宮中時,迷宮會自動從0 開始計時。當計到10000 後,迷宮會自動

關閉,裡面的一切生靈(包括fish 算了)都無逃逸的可能了——所以一旦進入迷宮,必須

在最少的步數內逃離!否則,嘿嘿~ 死得你一瞧起。

雖然很多人對fish 的死將無動於衷,更有甚者將會幸災樂禍,但是作為乙個正直、智

慧、無私、偉大、光明、聖潔的人,你覺得應該為fish 做點什麼,比如告訴他:至少需要

多少時刻才能逃離迷宮(fish 不要高興的太早,反正告訴了步數你也不一定能夠逃出來的)。

輸入檔案(palamaze.in)

第一行兩個數n,m。(n,m<=20)表示n 行m 列

接下來。n 行m 列的矩陣。

『*』表示障礙

『+』表示正常的路

『#』表示起點

『$』表示終點

數字表示鑰匙,大寫字母表示橋橫放,小寫字母表示橋豎放

不超過9 對字母

其中1 對應a,a 依次類推

輸出檔案(palamaze.out)

一行,表示最小步數。如果不能逃出,輸出10001。

樣例輸入

4 4****

*#+*

*+$*

****

樣例輸出

這道題一開始想的很複雜,以為很難但又能上手,考試的時候就嘗試bfs了一下,有很多細節沒考慮到,但還是得了最高分50.

考完到網上搜了下題解,結果很多部落格都是說"這道題還是用來養眼算了。暴力搜尋(不論是a*還是bfs)能得40分的樣子。正解再說吧"

我也是服了。

有乙個部落格有正解,用的是迭代加深+a*,反正我是看不懂,所以只能靠自己了。

經過一次又一次的測試,終於ac了

看**裡的注釋,上**

#include #include #include #include #include #include #include #include #include #define open(s) freopen(s".in","r",stdin);freopen(s".out","w",stdout);

#define close fclose(stdin);fclose(stdout);

using namespace std;

char s[22][22],w;

struct xx;

queue a;

int n,m,qx,qy,zx,zy,l=,r=; //4個方向

bool f[22][22][11];

int main()

a.push((xx)});

while(!a.empty())

a.pop();

if(f[now.x][now.y][now.num]) continue; //f[x][y][k]表示座標為x,y,有k個鑰匙的狀態有沒有出現過

f[now.x][now.y][now.num]=1;

for(int i=0;i<4;i++)}}

for(int i=0;i<4;i++)

if(w=='+'||w>='1'&&w<='9') a.push((xx)});

if(w>='a'&&w<='z') });

if(l[i]&&s[now.x+l[i]*2][now.y]!='*')

a.push((xx)});

}if(w>='a'&&w<='z')});

if(r[i]&&s[now.x][now.y+r[i]*2]!='*')

a.push((xx)});}}

}printf("%d",10001); //bfs無法找到解,輸出10001

close;

return 0;

}

迷宮問題bfs

迷宮問題 採用佇列的廣度優先遍歷 bfs 思想是從乙個頂點v0開始,輻射狀地優先遍歷其周圍較廣的區域 找到的解為最優解 include define m 8 define n 8 define maxsize 1000 typedef struct box typedef struct qutype...

迷宮問題BFS

the code 資料結構迷宮.cpp 定義控制台應用程式的入口點。include stdafx.h include include include include define n 4 定義迷宮為4 4 using namespace std struct pot 為記錄路徑的rec準備,座標 x...

迷宮問題bfs

小明置身於乙個迷宮,請你幫小明找出從起點到終點的最短路程。小明只能向上下左右四個方向移動。輸入包含多組測試資料。輸入的第一行是乙個整數t,表示有t組測試資料。每組輸入的第一行是兩個整數n和m 1 n,m 100 接下來n行,每行輸入m個字元,每個字元表示迷宮中的乙個小方格。字元的含義如下 s 起點 ...