nyoj ACM 迷宮尋寶(一) bfs

2021-07-30 03:18:45 字數 2679 閱讀 9039

迷宮尋寶(一)

時間限制:1000 ms | 記憶體限制:65535 kb

難度:4

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

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

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

m<20)

,分別代表了迷宮的行和列。接下來的m每行有n個字元,描述了迷宮的布局。其中每個字元的含義如下:

.表示可以走的路

s:表示acm的出發點

g表示寶藏的位置

x表示這裡有牆,acm無法進入或者穿過。

a,b,c,d,e表示這裡是門,a,b,c,d,e表示對應大寫字母的門上的鑰匙。

注意acm只能在迷宮裡向上下左右四個方向移動。

最後,輸入0 0表示輸入結束。

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

樣例輸入

4 4

s.x.

a.x.

..xg

…. 3 4

s.xa

.axb

b.ag

0 0

樣例輸出

yes

no 在main()函式中

記錄開始位置

記錄某種鑰匙總數(即剩餘未訪問到的鑰匙數),

在bfs函式 中:

將之前的記錄清空

將開始位置入隊,利用廣搜,從開始位置進行搜尋,進行逐個出隊判斷:

1:如果找到某把鑰匙,則剩餘這種鑰匙數減1,並進行判斷:這種鑰匙是否已找到完,這種鑰匙所對應的門是否以找到,如果兩個條件都滿足,則把該門入隊。然後把鑰匙位置標記已遍歷,對其相鄰點進行廣搜;

2:如果找到某個門並且其鑰匙沒有找到全部,則用陣列door來記錄門的位置;

3:如果找到寶藏,則返回1,表示成功找到寶藏;

4:如果為開始位置』s』、可走位置』.』、已找到全部鑰匙的門,則將其標記為已遍歷,對其相鄰點進行廣搜;

5:如果該位置為牆』x』,則將其跳過不遍歷;

如果隊列為空,則說明在找到寶藏之前無可遍歷位置,則返回0,表示未能找到寶藏;

以下參考自此部落格

我的**:

#include

#include

#include

#include

using

namespace

std;

typedef

structnode;

node door[5];

int key[5];

int num[5];

int m,n;

char s[50][50];

bool visited[50][50];

queue

q;void ergodic(node pr)//向4個方向走

d.x=pr.x;

d.y=pr.y-1;

if(d.y>=0 && visited[d.x][d.y]==false && s[d.x][d.y]!='x')

d.x=pr.x+1;

d.y=pr.y;

if(d.xfalse && s[d.x][d.y]!='x')

d.x=pr.x-1;

d.y=pr.y;

if(d.x>=0 && visited[d.x][d.y]==false && s[d.x][d.y]!='x')

return;

}void bfs(int sx,int sy)

while(!q.empty())

q.pop();

node head;

head.x=sx;

head.y=sy;//記錄開始位置併入隊,利用廣搜,從開始位置進行搜尋

q.push(head);

visited[sx][sy]=true;

while(!q.empty())

if(c=='a' || c=='b' || c=='c' || c=='d' || c=='e' )

continue;

}if(c=='a' || c=='b' || c=='c' || c=='d' || c=='e' )

continue;

}ergodic(pr);

}printf("no\n");

return;

}int main()

memset(num,0,sizeof(num));

int sx,sy;

for(int i=0;ifor(int j=0;jif(s[i][j]=='s')

else

if(s[i][j]=='a' ||s[i][j]=='b' || s[i][j]=='c' || s[i][j]=='d' || s[i][j]=='e')}}

bfs(sx,sy);

}return

0;}

迷宮尋寶(一) bfs

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

迷宮尋寶(一) BFS

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

NYOJ82 迷宮尋寶(一) BFS

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