迷宮尋寶(一)
時間限制: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必須開啟門,但是,開門之前必須在迷宮裡找到這個開啟這...