NYOJ82-迷宫寻宝1
生活随笔
收集整理的這篇文章主要介紹了
NYOJ82-迷宫寻宝1
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
迷宮尋寶(一)
時間限制: 1000 ?ms ?|? 內存限制: 65535 ?KB
難度: 4
描述一個叫ACM的尋寶者找到了一個藏寶圖,它根據藏寶圖找到了一個迷宮,這是一個很特別的迷宮,迷宮里有N個編過號的門(N<=5),它們分別被編號為A,B,C,D,E.為了找到寶藏,ACM必須打開門,但是,開門之前必須在迷宮里找到這個打開這個門所需的所有鑰匙(每個門都至少有一把鑰匙),例如:現在A門有三把鑰匙,ACM就必須找全三把鑰匙才能打開A門。現在請你編寫一個程序來告訴ACM,他能不能順利的得到寶藏。
輸入可能會有多組測試數據(不超過10組)。
每組測試數據的第一行包含了兩個整數M,N(1<N,M<20),分別代表了迷宮的行和列。接下來的M每行有N個字符,描述了迷宮的布局。其中每個字符的含義如下:
.表示可以走的路
S:表示ACM的出發點
G表示寶藏的位置
X表示這里有墻,ACM無法進入或者穿過。
A,B,C,D,E表示這里是門,a,b,c,d,e表示對應大寫字母的門上的鑰匙。
注意ACM只能在迷宮里向上下左右四個方向移動。
最后,輸入0 0表示輸入結束。
4 4 S.X.a.X. ..XG .... 3 4S.Xa.aXB b.AG 0 0
YES NO
題意就是 給你個圖大寫字母表示門 小寫字母表示對應的鑰匙 必須要把對應門所有鑰匙集齊后 才能開門 S是起點 G是終點 問能否抵達終點
注意這道題難點其實就是搜索 那么搜索到門的時候如何處理呢? 我如何知道在搜索到門之前是否能夠搜全足夠的鑰匙呢 那么我們不如循環廣搜 只要本次BFS搜到鑰匙就繼續廣搜? 前面的BFS先搜到鑰匙 后面的去匹配 把能搜的鑰匙搜齊全了 在去破門
如果門中有鑰匙 就再搜索 直到有結果
#include<cstdio> #include<cstring> #include<queue> #include<algorithm> #include<iostream> using namespace std; char p[21][21]; struct node {int x,y; }; int b[5],has[5];// 0 a 1 b 2 c 3 d 4 e b表示圖中鑰匙有多少個 has表示最后階段性搜索能搜到多少個 int dir[][2]={{-1,0},{0,1},{1,0},{0,-1}}; int main() {int n,m;node s,e;while(cin>>n>>m,n||m){memset(b,0,sizeof(b));memset(has,0,sizeof(has));for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){char c;cin>>c;p[i][j]=c;if(c=='S')s.x=i,s.y=j;else if(islower(c))b[c-'a']++;//記錄一共有多少個鑰匙}}bool bok[21][21];queue<node>q;q.push(s);bok[s.x][s.y]=1;bool f=0,ss=1;//f 表示有沒有結果 ss表示這一次搜索有沒有新的鑰匙while(ss&&!f){ss=0;while(!q.empty())q.pop();memset(bok,0,sizeof(bok)); q.push(s);bok[s.x][s.y]=1;while(!q.empty()){node a,bb;a= q.front();q.pop();char c = p[a.x][a.y];if(c=='G'){f = 1;puts("YES");break;}else if(c!='S'&&isupper(c)&&has[c+32-'a'] != b[c+32-'a']){continue;//如果這個門的鑰匙沒集齊 就不能向下執行}for(int i=0;i<4;i++){int tx,ty;tx = a.x+dir[i][0];ty = a.y+dir[i][1];if(tx<=n&&ty<=m&&tx&&ty&&!bok[tx][ty]&&p[tx][ty]!='X'){if(islower(p[tx][ty])){//該點是鑰匙 就記錄下來 該點置位為'.'has[p[tx][ty]-'a']++;p[tx][ty]='.';ss=1;} bb.x=tx,bb.y=ty;q.push(bb);bok[tx][ty]=1; }}}}if(!f)puts("NO"); }return 0; }
總結
以上是生活随笔為你收集整理的NYOJ82-迷宫寻宝1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ppt使用vba编写倒计时_在Offic
- 下一篇: 开始Go开发之旅-Golang架构师之路