OJ 4105 拯救公主 廣搜

2021-07-26 19:45:04 字數 2177 閱讀 8001

多災多難的公主又被大魔王抓走啦!國王派遣了第一勇士阿福去拯救她。

身為超級厲害的術士,同時也是阿福的好夥伴,你決定祝他一臂之力。你為阿福提供了一張大魔王根據地的地圖,上面標記了阿福和公主所在的位置,以及一些不能夠踏入的禁區。你還貼心地為阿福製造了一些傳送門,通過乙個傳送門可以瞬間轉移到任意乙個傳送門,當然阿福也可以選擇不通過傳送門瞬移。傳送門的位置也被標記在了地圖上。此外,你還查探到公主所在的地方被設下了結界,需要集齊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!」(只輸出引號裡面的內容,不輸出引號)。每組資料的輸出結果佔一行。

1

7 8 2

……..

..s..#0.

.##..1..

.0#…..

…1#…

…##e..

…1….

迷宮問題,區別在於要集齊寶石,並且有傳遞門,因為有寶石數目限制所以是否訪問過的標記要增加乙個維度使用者表示特定寶石數目下是否訪問過某一結點。這次7218變的寫法是用常規的(x,y)表示座標了,確認這樣更好寫些。。

鬱悶的是寫出來後樣例通過了,也自己找了很多測試項通過了,結果提示oj死活過不了,之後睡了一覺隔了一天才想到是doorcount沒有置0!**三公升!!!

#include 

#include

#include

#include

using

namespace

std;

#define max 201

char a[max][max];

struct node

node(int xx, int yy, int gg, int dd) : x(xx), y(yy), gem(gg), deep(dd)

};int dir[4][2] = ,,,};

int visited[max][max][1

<< 5 - 1]; //寶石數目最大11111

int r, c, k, doorcount;

node doors[11];

void print(int result)

int bit1count(int value)

return count;

}void printqueue(std::queue

q) cout

<< endl << endl;

}int gettarget(node* node, node* endnode)

int bfs(node* startnode, node* endnode)

if (gettarget(&newnode, endnode))

q.push(newnode);

//如果是傳送門的話就將所有其它傳送門加入搜尋佇列。

if (a[newx][newy] == '$') }}

//printqueue(q);

}return -1;

}int main() }}

print(bfs(startnode, endnode));

}return

0;}