HDU - 2102 A计划 【BFS】
题目链接
http://acm.hdu.edu.cn/showproblem.php?pid=2102
思路
题目有两个坑点
0.Output 说 能在T时刻 找到公主 就输出 YES 但实际上 只要在T时刻或者T时刻之前找到就可以了
1.如果传输机另一边 是 墙 那么就会被撞死 那如果另一边也是传输机 那么也是就会传来传去 也是行不通的
解决方法 如果 传输机另一边是墙 那么就把这个传输机设置为墙
如果传输机另一边也是传输机 那就把 这两个传输机都设置为墙
因为传输的时候是不需要花费时间的 所以假如我们当前的状态是在传输机上 我们只需要更改一下 楼层就可以了
然后就是BFS 了
AC代码
#include <cstdio>
#include <cstring>
#include <ctype.h>
#include <cstdlib>
#include <cmath>
#include <climits>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <map>
#include <stack>
#include <set>
#include <list>
#include <numeric>
#include <sstream>
#include <iomanip>
#include <limits>
#define CLR(a, b) memset(a, (b), sizeof(a))
#define pb push_back
using namespace std;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
typedef pair <int, int> pii;
typedef pair <ll, ll> pll;
typedef pair<string, int> psi;
typedef pair<string, string> pss;
const double PI = acos(-1.0);
const double E = exp(1.0);
const double eps = 1e-8;
const int INF = 0x3f3f3f3f;
const int maxn = 3e1 + 5;
const int MOD = 1e9 + 7;
int n, m, t;
int Move[4][2]
{
-1, 0,
1, 0,
0,-1,
0, 1,
};
string G[2][15];
int v[2][15][15];
int ans;
int scur, sx, sy, ecur, ex, ey;
struct node
{
int x, y, cur;
int step;
};
bool ok(int cur, int x, int y)
{
if (x < 0 || x >= n || y < 0 || y >= m || G[cur][x][y] == '*')
return false;
return true;
}
void bfs()
{
CLR(v, 0);
node tmp;
tmp.cur = scur;
tmp.x = sx;
tmp.y = sy;
tmp.step = 0;
v[tmp.cur][tmp.x][tmp.y] = 1;
queue <node> q;
q.push(tmp);
while (!q.empty())
{
node u = q.front(), V;
q.pop();
if (u.x == ex && u.y == ey && u.cur == ecur)
{
if (u.step <= t)
ans = 1;
return;
}
if (u.step > t)
return;
for (int i = 0; i < 4; i++)
{
V.cur = u.cur;
V.x = u.x + Move[i][0];
V.y = u.y + Move[i][1];
V.step = u.step + 1;
if (ok(V.cur, V.x, V.y))
{
if (G[V.cur][V.x][V.y] == '#')
V.cur = !V.cur;
if (v[V.cur][V.x][V.y] == 0)
q.push(V);
v[V.cur][V.x][V.y] = 1;
}
}
}
}
int main()
{
int T;
cin >> T;
while (T--)
{
scanf("%d%d%d", &n, &m, &t);
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < n; j++)
cin >> G[i][j];
}
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < n; j++)
{
for (int k = 0; k < m; k++)
{
if (G[i][j][k] == '#')
{
if (G[!i][j][k] == '*')
G[i][j][k] = '*';
else if (G[!i][j][k] == '#')
{
G[i][j][k] = G[!i][j][k] = '*';
}
}
else if (G[i][j][k] == 'S')
{
G[i][j][k] = '.';
scur = i;
sx = j;
sy = k;
}
else if (G[i][j][k] == 'P')
{
G[i][j][k] = '.';
ecur = i;
ex = j;
ey = k;
}
}
}
}
ans = 0;
bfs();
if (ans)
printf("YES\n");
else
printf("NO\n");
}
}