問題描述
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 起點 ...