2020牛客寒假算法基础集训营5.G题(BFS)

街机争霸

https://ac.nowcoder.com/acm/contest/3006/G

G.街机争霸

题意:中文题面,直接看题目。。。

题解:因为有僵尸的限制,在传统bfs二维坐标的基础上又增加了时间。具体参考官方题解。很好的题目,学习了。图片说明

#include <bits/stdc++.h>
using namespace std;
const int maxn = 505;
int n, m, p, k;
int dstx, dsty;
char mp[maxn][maxn];
int zmb[maxn][maxn][20];
int dx[4] = {-1, 1, 0, 0};
int dy[4] = {0, 0, -1, 1};
int dz[2] = {-1, 1};
int vis[maxn][maxn][20][2];
struct node
{
    int x, y, z, ud;
};
queue<node> q;
void init()
{
    cin >> n >> m >> p >> k;
    memset(vis, -1, sizeof(vis));
    for (int i = 0; i < n; i++)
    {
        scanf("%s", mp[i]);
        for (int j = 0; j < m; j++)
        {
            if (mp[i][j] == 'A')
                dstx = i, dsty = j;
            else if (mp[i][j] == 'L')
            {
                q.push(node{i, j, 0, 0});
                vis[i][j][0][0] = 0;
            }
        }
    }
    for (int i = 0; i < p; i++)
    {
        int x, y;
        scanf("%d%d", &x, &y);
        x--, y--;
        zmb[x][y][0] = 1;
        int dst;
        char cmd[10];
        scanf("%s", cmd);
        if (cmd[0] == 'U')
            dst = 0;
        else if (cmd[0] == 'D')
            dst = 1;
        else if (cmd[0] == 'L')
            dst = 2;
        else if (cmd[0] == 'R')
            dst = 3;
        for (int j = 1; j < k; j++)
        {
            x = x + dx[dst];
            y = y + dy[dst];
            zmb[x][y][j] = 1;
        }
    }
}
bool check(int x, int y, int z)
{
    if (x < 0 || x >= n)
        return 0;
    if (y < 0 || y >= m)
        return 0;
    if (mp[x][y] == '&')
        return 0;
    if (zmb[x][y][z])
        return 0;
    return 1;
}
void solve()
{
    int ans = -1;
    while (!q.empty())
    {
        node tmp = q.front();
        q.pop();
        int x = tmp.x, y = tmp.y, z = tmp.z;
        if (x == dstx && y == dsty)
        {
            ans = vis[x][y][z][tmp.ud];
            break;
        }
        int dst = tmp.ud;
        if (z == 0 || z == k - 1)
            dst ^= 1;
        for (int i = 0; i < 4; i++)
        {
            int tx = x + dx[i];
            int ty = y + dy[i];
            int tz = z + dz[dst];
            if (check(tx, ty, tz) && vis[tx][ty][tz][dst] == -1)
            {
                vis[tx][ty][tz][dst] = vis[x][y][z][tmp.ud] + 1;
                q.push(node{tx, ty, tz, dst});
            }
        }
    }
    if (ans == -1)
        puts("Oh no");
    else
        printf("%d\n", ans);
}
int main()
{
    init();
    solve();
    return 0;
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务