2 条题解

  • 0
    @ 2025-7-13 9:08:57
    #include <bits/stdc++.h>
    using namespace std;
    int n, m, k;
    int x[105], y[105];
    int main()
    {
        cin >> n >> m >> k;
        for (int i = 1; i <= k; i++)
            cin >> x[i] >> y[i];
        int ans = 0;
        for (int i = 1; i <= n; i++)
            for (int j = 1; j <= m; j++)
            {
                int now = 0;
                for (int o = 1; o <= k; o++)
                {
                    if (x[o] == i && y[o] == j)
                    {
                        now = 0;
                        break;
                    }
                    if (abs(x[o] - i) + abs(y[o] - j) <= 2)
                        now++;
                }
                ans = max(ans, now);
            }
        cout << ans;
        return 0;
    }
    
    • 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;
      }
      
      • 1

      信息

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