题意:
给一个2 * n * m的迷宫,给起点,找终点。
问能否在规定时间内找到。
解析:
bfs,z维直接用 ^1 来处理。
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <stack>
#include <vector>
#include <queue>
#include <map>
#include <climits>
#include <cassert>
#define LL long long
#define lson lo, mi, rt << 1
#define rson mi + 1, hi, rt << 1 | 1
using namespace std;
const int maxn = 20;
const int inf = 0x3f3f3f3f;
const double eps = 1e-8;
const double pi = acos(-1.0);
const double ee = exp(1.0);
int dir[][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
int n, m, t;
char g[maxn][maxn][5];
int sx, sy, sz, ex, ey, ez;
int step[maxn][maxn][5];
struct Node
{
int x, y, z;
Node(int _x, int _y, int _z)
{
x = _x;
y = _y;
z = _z;
}
};
int bfs()
{
memset(step, -1, sizeof(step));
queue<Node> q;
step[sx][sy][sz] = 0;
q.push(Node(sx, sy, sz));
while (!q.empty())
{
Node now = q.front();
q.pop();
int x = now.x;
int y = now.y;
int z = now.z;
if (x == ex && y == ey && z == ez)
{
return step[x][y][z];
}
for (int i = 0; i < 4; i++)
{
int nx = x + dir[i][0];
int ny = y + dir[i][1];
int nz = z ^ 1;
if (0 <= nx && nx < n && 0 <= ny && ny < m && g[nx][ny][z] != '*')
{
if (g[nx][ny][z] == '#')
{
if (g[nx][ny][nz] != '#' && g[nx][ny][nz] != '*')///
{
if (step[nx][ny][nz] == -1)
{
step[nx][ny][nz] = step[x][y][z] + 1;
q.push(Node(nx, ny, nz));
}
}
}
else
{
if (step[nx][ny][z] == -1)
{
step[nx][ny][z] = step[x][y][z] + 1;
q.push(Node(nx, ny, z));
}
}
}
}
}
return -1;
}
int main()
{
#ifdef LOCAL
freopen("in.txt", "r", stdin);
#endif // LOCAL
int ncase;
scanf("%d", &ncase);
while (ncase--)
{
scanf("%d%d%d", &n, &m, &t);
getchar();
for (int z = 0; z < 2; z++)
{
for (int x = 0; x < n; x++)
{
for (int y = 0; y < m; y++)
{
scanf("%c", &g[x][y][z]);
if (g[x][y][z] == 'S')
{
sx = x;
sy = y;
sz = z;
}
if (g[x][y][z] == 'P')
{
ex = x;
ey = y;
ez = z;
}
}
getchar();
}
getchar();
}
int ans = bfs();
if (ans == -1)
{
printf("NO\n");
}
else
{
cout << ans << endl;
if (ans <= t)
printf("YES\n");
else
printf("NO\n");
}
}
return 0;
}