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 }

 

posted @ 2019-06-27 15:24  Veasky  阅读(400)  评论(4编辑  收藏  举报