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