题目:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=82
2018-06-23 23:44:05 p.s.自己省错题了:
描述
一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这是一个很特别的迷宫,迷宫里有N个编过号的门(N<=5),它们分别被编号为A,B,C,D,E.为了找到宝藏,ACM必须打开门,但是,开门之前必须在迷宫里找到这个打开这个门所需的所有钥匙(每个门都至少有一把钥匙),例如:现在A门有三把钥匙,ACM就必须找全三把钥匙才能打开A门。现在请你编写一个程序来告诉ACM,他能不能顺利的得到宝藏。
这里重点是开门前必须找到所有这个门对应的钥匙 orz。。。
目前难点在于,这样的情况:
4 7 S.Aa.X. a.Xc.C. b.X..DG .cB..Xd
该数据太恶心...一时半会儿没想到办法。
2018-06-28 17:51:14 p.s.今天看了又去一下昨天的结果,已显示该题AC了。
思路:记录迷宫中所有钥匙分别有多少,判断是否集齐该门对应的所有钥匙,如果没有集齐则将前一个位置记录到队列中。
2018-06-27 11:00:59 p.s.终于写出来了,这下应该对了,测试数据:
$ ./test 4 7 S.Aa.X. a.Xc.C. b.X..DG .cB..Xd YES X X A X X X . X X X X X C X X X X X X D G X X B X X X d 3 6 SbAdX. a.BD.G cBCdaX YES X X A X X . X X B D X G X B C X X X 4 4 S.X. a.X. ..XG .... YES X X X . X X X . X X X G X X X X 3 4 S.Xa .aXB b.AG NO X X X a X X X B X X A G
但oj上显示结果是:判题中...?!这是什么鬼 > < #(貌似是服务端内部错误。。。。
代码:
#include <bits/stdc++.h> using namespace std; struct ss { int i, j; ss() {} ss(int x, int y) : i(x), j(y) {} void startpoint(int x, int y) { i = x, j = y; } }; #define Index(c) ((c) - 'a') int key[5], dir[4][2] = { 1, 0, -1, 0, 0, 1, 0, -1 }; int a, b, c, d, e; bool bfs(vector<vector<char> > & maze, ss ps) { memset(key, 0, sizeof(key)); queue<ss> q, door; q.push(ps); maze[ps.i][ps.j] = 'X'; while(!q.empty()) { ps = q.front(); q.pop(); for (int i = 0; i < 4; i++) { ss n(ps.i + dir[i][0], ps.j + dir[i][1]); char ch = 0; if (n.i > -1 && n.i < maze.size() && n.j > -1 && n.j < maze[0].size()) { if (maze[n.i][n.j] == 'G') return true; ch = maze[n.i][n.j]; if (ch != 'X') { switch(ch) { case 'A': if (key[0] == a) q.push(n); else door.push(ps); break; case 'B': if (key[1] == b) q.push(n); else door.push(ps); break; case 'C': if (key[2] == c) q.push(n); else door.push(ps); break; case 'D': if (key[3] == d) q.push(n); else door.push(ps); break; case 'E': if (key[4] == e) q.push(n); else door.push(ps); break; } if (ch == '.') { q.push(n); maze[n.i][n.j] = 'X'; } else if (ch == 'a' || ch == 'b' || ch == 'c' || ch == 'd' || ch == 'e') { key[Index(ch)]++; while(!door.empty()) { q.push(door.front()); door.pop(); } q.push(n); maze[n.i][n.j] = 'X'; } } } } } return false; } int main() { int i, j; while(1) { a = 0, b = 0, c = 0, d = 0, e = 0; ss ps; cin >> i >> j; if (i == 0 && j == 0) break; vector<vector<char> > maze(i, vector<char>(j)); for (int i = 0; i < maze.size(); i++) for( int j = 0; j < maze[0].size(); j++) { cin >> maze[i][j]; switch(maze[i][j]) { case 'S': ps.startpoint(i, j); break; case 'a': a++; break; case 'b': b++; break; case 'c': c++; break; case 'd': d++; break; case 'e': e++; break; } } if (bfs(maze, ps)) cout << "YES" << endl; else cout << "NO" << endl; /* for (int i = 0; i < maze.size(); i++) { for( int j = 0; j < maze[0].size(); j++) cout << maze[i][j] << ' '; cout << endl; } */ } return 0; }