nyoj 82迷宮尋寶(一)
阿新 • • 發佈:2017-06-20
ret 接下來 set class 但是 ios char pre 移動 ACM只能在迷宮裏向上下左右四個方向移動。
最後,輸入0 0表示輸入結束。
迷宮尋寶(一)
時間限制: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表示對應大寫字母的門上的鑰匙。
註意
最後,輸入0 0表示輸入結束。
輸出
每行輸出一個YES表示ACM能找到寶藏,輸出NO表示ACM找不到寶藏。
樣例輸入
4 4
S.X.
a.X.
..XG
....
3 4
S.Xa
.aXB
b.AG
0 0
樣例輸出
YES
NO
//bfs #include <iostream> #include <cstring> #include <queue> using namespace std; bool bfs(int x, int y); struct data { int x; int y; }; int dx[4] = {-1, 1, 0, 0}; int dy[4] = {0, 0, -1, 1}; int m; int n; int s_x; //S的坐標 int s_y; int g_x; //G的坐標 int g_y; int a, b, c, d, e; //a~e的個數 int aa, bb, cc, dd, ee; //已經找到的a~e的個數 char g[25][25]; int vis[25][25]; int main() { while(cin >> m >> n, m + n) { a = b = c = d = e = 0; aa = bb = cc = dd = ee = 0; memset(g, ‘X‘, sizeof(g)); for(int i = 1; i <= m; i++) for(int j = 1; j <= n; j++) { cin >> g[i][j]; switch(g[i][j]) { case ‘a‘: a++; break; case ‘b‘: b++; break; case ‘c‘: c++; break; case ‘d‘: d++; break; case ‘e‘: e++; break; case ‘S‘: s_x = i; s_y = j; break; case ‘G‘: g_x = i; g_y = j; break; } } int flag = 0; for(int i = 0; i <= 5; i++) { memset(vis, 0, sizeof(vis)); if(bfs(s_x, s_y)) { flag = 1; break; } } if(flag == 1) cout << "YES\n"; else cout << "NO\n"; } } bool bfs(int x, int y) { queue<data> q; data t1, t2; t1.x = x; t1.y = y; q.push(t1); vis[x][y] = 1; while(!q.empty()) { t1 = q.front(); q.pop(); for(int i = 0; i < 4; i++) { int xx = t1.x + dx[i]; int yy = t1.y + dy[i]; if(g[xx][yy] == ‘G‘) return true; if(g[xx][yy] == ‘X‘ || vis[xx][yy] == 1) continue; if(g[xx][yy] >= ‘A‘ && g[xx][yy] <= ‘E‘) { switch(g[xx][yy]) { case ‘A‘: if(a == aa) g[xx][yy] = ‘.‘; break; case ‘B‘: if(b == bb) g[xx][yy] = ‘.‘; break; case ‘C‘: if(c == cc) g[xx][yy] = ‘.‘; break; case ‘D‘: if(d == dd) g[xx][yy] = ‘.‘; break; case ‘E‘: if(e == ee) g[xx][yy] = ‘.‘; break; } } if(g[xx][yy] == ‘.‘ || (g[xx][yy] >= ‘a‘ && g[xx][yy] <= ‘e‘)) { t2.x = xx; t2.y = yy; q.push(t2); vis[xx][yy] = 1; switch(g[xx][yy]) { case ‘a‘: aa++; break; case ‘b‘: bb++; break; case ‘c‘: cc++; break; case ‘d‘: dd++; break; case ‘e‘: ee++; break; } g[xx][yy] = ‘.‘; } } } return false; }
nyoj 82迷宮尋寶(一)