hdu 2102 A计划 伪3D迷宫

来源:互联网 发布:mac网盘下载速度慢 编辑:程序博客网 时间:2024/05/11 23:21

题意:

给一个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 | 1using 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;}


0 0
原创粉丝点击