多災多難的公主又被大魔王抓走啦!國王派遣了第一勇士阿福去拯救她。
身為超級厲害的術士,同時也是阿福的好夥伴,你決定祝他一臂之力。你為阿福提供了一張大魔王根據地的地圖,上面標記了阿福和公主所在的位置,以及一些不能夠踏入的禁區。你還貼心地為阿福製造了一些傳送門,通過乙個傳送門可以瞬間轉移到任意乙個傳送門,當然阿福也可以選擇不通過傳送門瞬移。傳送門的位置也被標記在了地圖上。此外,你還查探到公主所在的地方被設下了結界,需要集齊k種寶石才能開啟。當然,你在地圖上也標記出了不同寶石所在的位置。
你希望阿福能夠帶著公主早日凱旋。於是在阿福出發之前,你還需要為阿福計算出他最快救出公主的時間。
地圖用乙個r×c的字元矩陣來表示。字元s表示阿福所在的位置,字元e表示公主所在的位置,字元#表示不能踏入的禁區,字元$表示傳送門,字元.表示該位置安全,數字字元0至4表示了寶石的型別。阿福每次可以從當前的位置走到他上下左右四個方向上的任意乙個位置,但不能走出地圖邊界。阿福每走一步需要花費1個單位時間,從乙個傳送門到達另乙個傳送門不需要花費時間。當阿福走到寶石所在的位置時,就視為得到了該寶石,不需要花費額外時間。
輸入第一行是乙個正整數t(1 <= t <= 10),表示一共有t組資料。
每一組資料的第一行包含了三個用空格分開的正整數r、c(2 <= r, c <= 200)和k,表示地圖是乙個r×c的矩陣,而阿福需要集齊k種寶石才能夠開啟拘禁公主的結界。
接下來的r行描述了地圖的具體內容,每一行包含了c個字元。字元含義如題目描述中所述。保證有且僅有乙個s和e。$的數量不超過10個。寶石的型別在數字0至4範圍內,即不會超過5種寶石。
輸出對於每一組資料,輸出阿福救出公主所花費的最少單位時間。若阿福無法救出公主,則輸出「oop!」(只輸出引號裡面的內容,不輸出引號)。每組資料的輸出結果佔一行。
樣例輸入
17 8 2..........s..#0..##..1...0#........1#......##e.....1....
樣例輸出
11
ac**
#include #include #include #include #define n 210using namespace std;
int dir[2][4]=,};
int dp[n][n][1<<5-1],trans[20][2],n,m,k,tot,num,t,x,y,ans;
char map[n][n];
struct node;};
bool check(int key)
int bfs(int x,int y)
if (isdigit(map[xx][yy])) //
if (map[xx][yy]=='.') //普通地帶
if (map[xx][yy]=='$')//傳送門
}} }}
return -1;//若遍歷完還沒返回 就說明沒有可行方案
}main()
if (k>num) //沒有足夠的寶石
ans=bfs(x,y);
if (ans==-1) printf("oop!\n");
else printf("%d\n",ans);
}}
OpenJ Bailian 4116 拯救公主
公主被惡人抓走,被關押在牢房的某個地方。牢房用n m n,m 200 的矩陣來表示。矩陣中的每項可以代表道路 牆壁 和守衛 x 英勇的騎士 r 決定孤身一人去拯救公主 a 我們假設拯救成功的表示是 騎士到達了公主所在的位置 由於在通往公主所在位置的道路中可能遇到守衛,騎士一旦遇到守衛,必須殺死守衛才...
雙向廣度搜尋 拯救公主(一)
時間限制 1 sec 記憶體限制 128 mb 提交 狀態 討論版 公主被妖怪抓到了乙個山洞裡,為了盡快營救公主,王子決定不回城搬救兵去獨自營救。山洞為矩形且十分空曠,其中生活著k個妖怪。幸運的是這些妖怪晚上都會睡覺並且沒人守夜。但是若是離妖怪太近就會驚醒它,其他的妖怪也會被驚醒,所以我們要找一條距...
雙向搜尋 DP 拯救公主(二)
時間限制 1 sec 記憶體限制 128 mb 提交 狀態 討論版 公主被妖怪抓到了乙個山洞裡,為了盡快營救公主,王子決定不回城搬救兵去獨自營救。山洞為矩形且十分空曠,其中生活著k個妖怪。幸運的是這些妖怪晚上都會睡覺並且沒人守夜。但是若是離妖怪太近就會驚醒它,其他的妖怪也會被驚醒,所以我們要找一條距...