描述: 华强买到了不保熟的瓜,他很生气,遂决定…… 自己种瓜! 第二天,华强承包了一大片瓜田,他买来了 n2 个保熟的西瓜种子,并且严格按照一个 n×n 米间距的网格进行种植。为了方便华强记忆,这个网格的坐标从 1 开始编号,到 n 结束。 为了让瓜保熟,他又买来了 k 个洒水器,洒水器工作半径为 r 米,安装在在网格中的某些种子的正上方。 安装完这些洒水器后,华强很想知道现在他的瓜里面有多少能够被撒到水。 输入: 输入共包含 n+k 行。 第一行包含 3 个整数 n 、k 和 r ,分别表示网格边距、洒水器数量和洒水器工作半径,题目保证 1≤n,k≤200 。 接下来 k 行,每行两个整数 x 和 y ,表示每个洒水器在网格中的坐标 (x,y) 。 输出: 一行一个整数,表示被洒水器覆盖到的西瓜总数。 样例输入: 5 2 1 3 3 4 2 样例输出: 8 注释: 对于第一组样例,(3,3) 上的洒水器工作半径可以覆盖到 (3,3) (4,3) (2,3) (3,2) (3,4) 的瓜。而 (4,2) 上的洒水器可以覆盖到 (4,2) (5,2) (3,2) (4,1) (4,3) 的瓜。去重后,共有 8 个瓜被覆盖到。用c语言写代码
时间: 2023-05-25 17:04:30 浏览: 167
#include <stdio.h>
#include <stdbool.h>
int main() {
int n, k, r;
scanf("%d %d %d", &n, &k, &r);
// 建立一个网格地图
bool map[201][201] = {false};
// 标记洒水器的位置
for (int i = 0; i < k; i++) {
int x, y;
scanf("%d %d", &x, &y);
map[x][y] = true;
}
// 遍历所有瓜
int count = 0; // 计数器
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
bool flag = false; // 标记这个瓜是否被覆盖到了
// 检查所有洒水器
for (int p = i - r; p <= i + r; p++) {
for (int q = j - r; q <= j + r; q++) {
if (p >= 1 && p <= n && q >= 1 && q <= n) {
// 如果这个洒水器覆盖到了这个瓜,就标记一下
if (map[p][q] && ((p-i)*(p-i)+(q-j)*(q-j)) <= r*r) {
flag = true;
break;
}
}
}
if (flag) break; // 如果已经被覆盖了,就不用再检查其他洒水器
}
if (flag) count++; // 如果最终被覆盖到了,就计数器加一
}
}
printf("%d", count);
return 0;
}
阅读全文