迷宮尋寶(一) nyoj 82

2021-06-20 06:40:22 字數 2298 閱讀 2388

時間限制:

1000 ms  |  記憶體限制:

65535 kb

難度: 4

描述 乙個叫acm的尋寶者找到了乙個藏寶圖,它根據藏寶圖找到了乙個迷宮,這是乙個很特別的迷宮,迷宮裡有n個編過號的門(n<=5),它們分別被編號為a,b,c,d,e.為了找到寶藏,acm必須開啟門,但是,開門之前必須在迷宮裡找到這個開啟這個門所需的所有鑰匙(每個門都至少有一把鑰匙),例如:現在a門有三把鑰匙,acm就必須找全三把鑰匙才能開啟a門。現在請你編寫乙個程式來告訴acm,他能不能順利的得到寶藏。

輸入

輸入可能會有多組測試資料(不超過10組)。

每組測試資料的第一行包含了兩個整數m,n(1

輸出每行輸出乙個yes表示acm能找到寶藏,輸出no表示acm找不到寶藏。

樣例輸入

4 4 

s.x.

a.x.

..xg

....

3 4

s.xa

.axb

b.ag

0 0

樣例輸出

yes 

no

這題要注意想要開啟乙個門,要先收集齊這個門所有的鑰匙.

我的方法是廣搜,我做這個題的時候遇到的問題就是  有一類門,搜尋到的時候鑰匙還沒有集齊,但是在後面的搜尋過程中鑰匙可以集齊的.那麼如果遇到這樣的門開怎麼辦.

我剛開始想的辦法是將這類的門記錄到乙個陣列中去,等搜尋完一遍之後,再在第一遍搜尋的基礎上從這個陣列記錄的門的位置再開始搜尋.但是問題是,如果乙個地圖中有很多這一類的門的話,那麼就要進行很多次搜尋,效率很低,而且我按照這個思路提交的**還不正確= =.

後來請教了學長. 採用的方法是需要提前記錄 門的位置和每個門所需要的鑰匙數量.還要有個陣列記錄上面說的那一類門,這樣,當我搜到乙個門的時候,看看所需要的鑰匙是不是收集齊了,如果是入佇列.  如果不是,將門記錄到陣列中.   每次搜到鑰匙就看看對應的門的鑰匙是不是齊了,如果齊了並且門之前被搜到過,就把門直接放到佇列裡,如果不是鑰匙計數加1.

#include #include #include #define size 25

using namespace std;

struct node

;node st;

queueq;

char map[size][size];

int m, n;//行和列

int key[10];//記錄每個門有幾個鑰匙

node add[10];//記錄每個門的位址

bool non[10];//記錄搜尋過程中搜到的但是鑰匙還沒有找齊的門

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

int bfs(node start)

else if(map[xx][yy] >= 'a' && map[xx][yy] <= 'e')

;q.push(e2);

non[t] = 0;}}

else if(map[xx][yy] >= 'a' && map[xx][yy] <= 'e')

else

}else if(map[xx][yy] == '.')

}} }

return 0;

}int main (void)

int t;

for(i = 0; i < m; i++)

if(map[i][j] == 's')

if(map[i][j] >= 'a' && map[i][j] <= 'e')

;add[t] = ex;//記錄門的座標}}

} if(bfs(st) == 1)

printf("yes\n");

else

printf("no\n");

} return 0;

}

隨手搬幾個測試資料~~(其實是討論區看到的= =)

5 5e.b.s

xxa.e

gx.xc

c...x

***bx

yes5 5

ecb.s

xax.e

gx.xc

ca...

***cx

yes5 5

aee.s

cxx.e

***xc

caa..

gxxcx

yes5 5

aae.s

cxx.e

***xc

caae.

gxxcx

yes1 2

sgyes

1 3sxg

no

nyoj82迷宮尋寶(一)

時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述 乙個叫acm的尋寶者找到了乙個藏寶圖,它根據藏寶圖找到了乙個迷宮,這是乙個很特別的迷宮,迷宮裡有n個編過號的門 n 5 它們分別被編號為a,b,c,d,e.為了找到寶藏,acm必須開啟門,但是,開門之前必須在迷宮裡找到這個開啟這...

Nyoj 82 迷宮尋寶(一)

include include include include using namespace std const int maxn 25 struct point pos point pos targetpos,doorpos 5 寶藏的位置,每個門的位置 char graph maxn maxn...

NYOJ82 迷宮尋寶(一)

時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述 乙個叫acm的尋寶者找到了乙個藏寶圖,它根據藏寶圖找到了乙個迷宮,這是乙個很特別的迷宮,迷宮裡有n個編過號的門 n 5 它們分別被編號為a,b,c,d,e.為了找到寶藏,acm必須開啟門,但是,開門之前必須在迷宮裡找到這個開啟這...