HDU2102 A计划
题目:
可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验。魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老。年迈的国王正是心急如焚,告招天下勇士来拯救公主。不过公主早已习以为常,她深信智勇的骑士LJ肯定能将她救出。
现据密探所报,公主被关在一个两层的迷宫里,迷宫的入口是S(0,0,0),公主的位置用P表示,时空传输机用#表示,墙用*表示,平地用.表示。骑士们一进入时空传输机就会被转到另一层的相对位置,但如果被转到的位置是墙的话,那骑士们就会被撞死。骑士们在一层中只能前后左右移动,每移动一格花1时刻。层间的移动只能通过时空传输机,且不需要任何时间。
输入:
输入的第一行C表示共有C个测试数据,每个测试数据的前一行有三个整数N,M,T。 N,M迷宫的大小N*M(1 <= N,M <=10)。T如上所意。接下去的前N*M表示迷宫的第一层的布置情况,后N*M表示迷宫第二层的布置情况。
输出:
如果骑士们能够在T时刻能找到公主就输出“YES”,否则输出“NO”。
样例:
分析:注意传送是强制性的,如果传送到传送门或者墙标记vis并跳过;
给一组测试数据(我踩的坑)
1
3 3 2
S..
.#.
...
#*#
*P*
#*#
ans:YES
1 #include<iostream> 2 #include<sstream> 3 #include<cstdio> 4 #include<cstdlib> 5 #include<string> 6 #include<cstring> 7 #include<algorithm> 8 #include<functional> 9 #include<iomanip> 10 #include<numeric> 11 #include<cmath> 12 #include<queue> 13 #include<vector> 14 #include<set> 15 #include<cctype> 16 #define PI acos(-1.0) 17 const int INF = 0x3f3f3f3f; 18 const int NINF = -INF - 1; 19 typedef long long ll; 20 #define MOD 1000007 21 using namespace std; 22 char maze[2][15][15]; 23 int dy[4] = {1, 0, -1, 0}, dz[4] = {0, 1, 0, -1}; 24 int n, m, t; 25 struct node 26 { 27 int x, y, z; 28 int step; 29 }p; 30 int vis[2][15][15]; 31 void bfs() 32 { 33 queue<node> q; 34 memset(vis, 0, sizeof(vis)); 35 vis[0][0][0] = 1; 36 q.push(node{0, 0, 0, 0}); 37 while (q.size()) 38 { 39 node tmp = q.front(); 40 q.pop(); 41 int nx = tmp.x; 42 if (maze[tmp.x][tmp.y][tmp.z] == '#') 43 { 44 nx = 1 - tmp.x; 45 vis[nx][tmp.y][tmp.z] = 1; 46 //cout << tmp.x << ' ' << tmp.y << ' ' << tmp.z << endl; 47 if (maze[nx][tmp.y][tmp.z] == '#' || maze[nx][tmp.y][tmp.z] == '*') continue; 48 } 49 if (tmp.step > t) 50 { 51 //cout << tmp.x << ' ' << tmp.y << ' ' << tmp.z << endl; 52 cout << "NO" << endl; 53 return; 54 } 55 if (nx == p.x && tmp.y == p.y && tmp.z == p.z) 56 { 57 cout << "YES" << endl; 58 return; 59 } 60 for (int i = 0; i < 4; ++i) 61 { 62 int ny = tmp.y + dy[i], nz = tmp.z + dz[i]; 63 if (ny >= 0 && ny < n && nz >= 0 && nz < m && maze[nx][ny][nz] != '*' && !vis[nx][ny][nz]) 64 { 65 vis[nx][ny][nz] = 1; 66 int tim = tmp.step + 1; 67 //cout << nx << ' ' << ny << ' ' << nz << ' ' << tim << endl; 68 q.push(node{nx, ny, nz, tim}); 69 } 70 } 71 } 72 cout << "NO" << endl; 73 } 74 int main() 75 { 76 int T; 77 cin >> T; 78 while (T--) 79 { 80 cin >> n >> m >> t; 81 for (int i = 0; i < 2; ++i) 82 { 83 for (int j = 0; j < n; ++j) 84 { 85 for (int k = 0; k < m; ++k) 86 { 87 cin >> maze[i][j][k]; 88 if (maze[i][j][k] == 'P') p.x = i, p.y = j, p.z = k; 89 } 90 } 91 if (!i) 92 { 93 string ss; 94 cin.ignore(); 95 getline(cin, ss); 96 } 97 } 98 //cout << p.x << ' ' << p.y << ' ' << p.z << endl; 99 bfs(); 100 } 101 return 0; 102 }
常常因身处温室而不自知,因而懈怠;
及时当勉励,岁月不待人!