1 条题解

  • 1
    @ 2025-4-7 23:33:02

    题意

    给你地图,图中的11代表这里有根据地,你越靠近根据地,越容易被敌人发现,危险等级越高。不能从根据地中间穿过。 给你起点,终点,求最少的危险等级和使之可以到达,如果没有 输出,nono solutionsolution。 危险等级是这么定义的,你在某个点,这个点离它最近的根据地的距离为dd,那么,这个点的危险等级就是,矩阵的长+宽-dd

    标程

    #include <iostream>
    #include <queue>
    #include <cstring>
    #include <limits.h>
    using namespace std;
    
    const int MAX = 85;
    int map[MAX][MAX];
    int level[MAX][MAX];
    int result[MAX][MAX];
    int n, m;
    struct Node {
        int x, y, lev;
    };
    
    queue<Node> q;
    
    bool canNotVisit(int x, int y, int mode) {
        if (mode < 4) {
            if (mode == 0)
                return map[x-1][y-1] && map[x-1][y];
            else
                return map[x][y] && map[x][y-1];
        } else {
            if (mode == 4)
                return map[x][y-1] && map[x-1][y-1];
            else
                return map[x][y] && map[x-1][y];
        }
    }
    
    void pushQueue(int x, int y, int lev) {
        Node temp;
        temp.x = x;
        temp.y = y;
        temp.lev = lev;
        q.push(temp);
    }
    
    int main() {
        int dis[] = {-1, 0, 1, 0, 0, -1, 0, 1};
        int ncases;
        char ch;
        int x, y, lev, a, b;
        cin >> ncases;
        while (ncases--) {
            cin >> n >> m;
            Node start, end;
            cin >> start.x >> start.y >> end.x >> end.y;
    
            memset(map, 0, sizeof(map));
            memset(level, 0, sizeof(level));
            for (int i = 0; i <= n; ++i)
                for (int j = 0; j <= m; ++j)
                    result[i][j] = INT_MAX;
    
            for (int i = 0; i < n; ++i) {
                for (int j = 0; j < m; ++j) {
                    cin >> ch;
                    map[i][j] = ch - '0';
                    if (map[i][j]) {
                        level[i][j] = level[i][j+1] = level[i+1][j] = level[i+1][j+1] = n + m;
                        pushQueue(i, j, n + m);
                        pushQueue(i, j + 1, n + m);
                        pushQueue(i + 1, j, n + m);
                        pushQueue(i + 1, j + 1, n + m);
                    }
                }
            }
    
            while (!q.empty()) {
                Node temp = q.front();
                q.pop();
                x = temp.x;
                y = temp.y;
                lev = temp.lev - 1;
                for (int i = 0; i < 8; i += 2) {
                    a = x + dis[i];
                    b = y + dis[i + 1];
                    if (a >= 0 && a <= n && b >= 0 && b <= m && !canNotVisit(x, y, i) && lev > level[a][b]) {
                        level[a][b] = lev;
                        pushQueue(a, b, lev);
                    }
                }
            }
    
            start.lev = result[start.x][start.y] = level[start.x][start.y];
            end.lev = level[end.x][end.y];
            q.push(start);
            while (!q.empty()) {
                Node temp = q.front();
                q.pop();
                x = temp.x;
                y = temp.y;
                lev = temp.lev;
                for (int i = 0; i < 8; i += 2) {
                    a = x + dis[i];
                    b = y + dis[i + 1];
                    if (a >= 0 && a <= n && b >= 0 && b <= m && !canNotVisit(x, y, i) && lev + level[a][b] < result[a][b]) {
                        result[a][b] = lev + level[a][b];
                        Node ntemp;
                        ntemp.x = a;
                        ntemp.y = b;
                        ntemp.lev = result[a][b];
                        q.push(ntemp);
                    }
                }
            }
    
            if (result[end.x][end.y] == INT_MAX)
                cout << "no solution" << endl;
            else
                cout << result[end.x][end.y] << endl;
        }
        return 0;
    }
    
    • 1

    信息

    ID
    698
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    11
    已通过
    1
    上传者