2 条题解

  • 0
    @ 2025-7-5 12:48:45

    注意到数据规模都在01000\sim100之内,只需要暴力搜索即可完成。
    需要注意的是这题提到的曼哈顿距离不超过2,具体实现可以通过提前写好对应的12个相对坐标进行处理(不包括本身,即0,1|0,2|0,-1|0,-2等等)。
    而本题解采用两重循环来计算相对坐标,根据曼哈顿距离的解释,需要行坐标之差+列坐标之差<=2,所以相对行坐标XX取值22-2\sim2,相对列坐标YY取值(2X)(2X)-(2-|X|)\sim(2-|X|)即可遍历本题要求所有相对坐标,这种解法便于理解并扩展到数值更大的曼哈顿距离。

    #include<bits/stdc++.h>
    using namespace std;
    bool map_ganyuan[111][111]; //记录对应坐标是否已有干员,true代表有,false代表无
    int main()
    {
        /*
        * n,m,k为题目给定值
        * i,j用于全图的循环遍历
        * x,y用于循环遍历相对于坐标(i,j)曼哈顿距离在2以内的所有坐标
        * t用于暂时记录当前坐标(i,j)附近的干员数
        * max_ganyuan是按题目要求输出的最大可覆盖干员数
        */
        int n, m, k, i, j, x, y, t, max_ganyuan;
        cin >> n >> m >> k;
        max_ganyuan = 0;
        for (i = 0; i < k; i++) {
            cin >> x >> y;
            map_ganyuan[x][y] = true;
        }
    
        //i,j两重循环用来遍历所有点,因为所有点都有可能是放置干员的位置
        for (i = 1; i <= n; i++) {
            for (j = 1; j <= m; j++) {
                //根据题目要求如果这个位置已经有干员了就不能放了
                if (map_ganyuan[i][j]) {
                    continue;
                }
    
                /*
                * 这里开始确定(i, j)是可能的干员放置位置,那么开始统计附近有多少已有干员
                * 将计数器置0
                */
                t = 0;
                /*
                * x, y两重循环用来遍历曼哈顿距离小于2的所有相对坐标
                * 要注意这种方法会遍历到相对坐标(0,0)即(i,j)坐标本身
                * 但是本题要放干员的位置肯定本身没有干员,所以对结果无影响
                */
                for (x = -2; x <= 2; x++) {
                    for (y = -(2 - abs(x)); y <= (2 - abs(x)); y++) {
                        //显然搜寻的最终坐标不能超过这张地图范围
                        if ((i + x) < 1
                            || (i + x) > n
                            || (j + y) < 1
                            || (j + y) > m) {
                            continue;
                        }
                        //如果目标坐标上有干员,则临时记录数+1
                        if (map_ganyuan[i + x][j + y]) {
                            t++;
                        }
                    }
                }
                //将临时记录与最终输出的记录相比较并更改最终输出
                max_ganyuan = max(max_ganyuan, t);
            }
        }
    
        cout << max_ganyuan;
        return 0;
    }
    

    信息

    ID
    14263
    时间
    1000ms
    内存
    256MiB
    难度
    6
    标签
    递交数
    101
    已通过
    31
    上传者