CCF-CSP题解 201604-4 游戏

ε祈祈猫儿з 提交于 2019-11-28 13:04:01

bfs

#include <bits/stdc++.h>
const int maxn = 100;

using namespace std;

int n, m, t;
bool hasDanger[maxn + 10][maxn + 10];
int danger[maxn + 10][maxn + 10][2];

struct tNode
{
    int r, c;
    int time;
    tNode(int rr, int cc, int ttime):r(rr), c(cc), time(ttime){}
};

int vis[maxn + 10][maxn + 10][310];

int main()
{
    scanf("%d%d%d", &n, &m, &t);

    memset(hasDanger, 0, sizeof(hasDanger));
    for (int i = 1, r, c, a, b; i <= t; i++)
    {
        scanf("%d%d%d%d", &r, &c, &a, &b);
        hasDanger[r][c] = true;
        danger[r][c][0] = a;
        danger[r][c][1] = b;
    }

    memset(vis, 0, sizeof(vis));
    queue<tNode> q;
    q.push(tNode(1, 1, 0));
    vis[1][1][0] = 1;
    while (true)
    {
        tNode x = q.front(); q.pop();
        int r = x.r, c = x.c, time = x.time;
        // printf("bfs: %d %d %d\n", r, c, time);
        if (r == n && c == m)
        {
            printf("%d\n", time);
            break;
        }
        if (r <= n - 1 && !vis[r + 1][c][time + 1] && (!hasDanger[r + 1][c] || !(danger[r + 1][c][0] <= time + 1 && danger[r + 1][c][1] >= time + 1)))
            q.push(tNode(r + 1, c, time + 1)), vis[r + 1][c][time + 1] = 1;
        if (c <= m - 1 && !vis[r][c + 1][time + 1] && (!hasDanger[r][c + 1] || !(danger[r][c + 1][0] <= time + 1 && danger[r][c + 1][1] >= time + 1)))
            q.push(tNode(r, c + 1, time + 1)), vis[r][c + 1][time + 1] = 1;
        if (r >= 2 && !vis[r - 1][c][time + 1] && (!hasDanger[r - 1][c] || !(danger[r - 1][c][0] <= time + 1 && danger[r - 1][c][1] >= time + 1)))
            q.push(tNode(r - 1, c, time + 1)), vis[r - 1][c][time + 1] = 1;
        if (c >= 2 && !vis[r][c - 1][time + 1] && (!hasDanger[r][c - 1] || !(danger[r][c - 1][0] <= time + 1 && danger[r][c - 1][1] >= time + 1)))
            q.push(tNode(r, c - 1, time + 1)), vis[r][c - 1][time + 1] = 1;
    }

    return 0;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!