NYOJ 82 迷宮尋寶(一)

2021-07-06 07:56:13 字數 1706 閱讀 4936

題目資訊:

時間限制:

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

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

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

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

5:如果該位置為牆'x',則將其跳過不便利;

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

**部分:

#include #include #include using namespace std;

struct node

;queueq;

char maze[25][25];

int key[5];

node door[5];

node d;

void add(int i, int j)

int bfs()

maze[i][j] = 'x';

add(i, j);

} else if(('a' == maze[i][j] || 'b' == maze[i][j] || 'c' == maze[i][j] || 'd' == maze[i][j] || 'e' == maze[i][j]) && 0 != key[maze[i][j] - 'a'])

else if('g' == maze[i][j])

return 1;

else if('x' != maze[i][j])

}return 0;

}int main()

else if('s' == maze[i][j])

}} if(1 == bfs())

printf("yes\n");

else

printf("no\n");

} return 0;

}

nyoj82迷宮尋寶(一)

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

迷宮尋寶(一) nyoj 82

時間限制 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...