1 条题解
-
0
题意分析
解题思路
1.首先,根据输入的 (Xsize) 和 (Ysize) 初始化一个二维数组 canvas 来表示画布,将所有元素初始化为 (0)。
2.接着,对于每个给定的圆,先计算出可能在圆内的像素的坐标范围(通过圆心坐标和半径确定最小和最大的 (x)、(y) 坐标)。
3.然后,在这个范围内遍历像素,判断每个像素是否满足圆的方程,如果满足则将其颜色设置为圆的颜色。
4.最后,按行输出画布上每个像素的颜色。
分析
实现步骤
代码实现
#include <cstdio> #include <cmath> const int MAX_SIZE = 1000; int canvas[MAX_SIZE][MAX_SIZE]; int main() { int Xsize, Ysize, N; scanf("%d %d %d", &Xsize, &Ysize, &N); // 初始化画布 for (int y = 0; y < Ysize; ++y) { for (int x = 0; x < Xsize; ++x) { canvas[y][x] = 0; } } // 处理每个圆 for (int i = 0; i < N; ++i) { int xi, yi, Ri, ci; scanf("%d %d %d %d", &xi, &yi, &Ri, &ci); // 计算可能在圆内的像素范围 int minX = (xi - Ri >= 0) ? xi - Ri : 0; int maxX = (xi + Ri < Xsize) ? xi + Ri : Xsize - 1; int minY = (yi - Ri >= 0) ? yi - Ri : 0; int maxY = (yi + Ri < Ysize) ? yi + Ri : Ysize - 1; for (int y = minY; y <= maxY; ++y) { for (int x = minX; x <= maxX; ++x) { if ((x - xi) * (x - xi) + (y - yi) * (y - yi) <= Ri * Ri) { canvas[y][x] = ci; } } } } // 输出画布 for (int y = 0; y < Ysize; ++y) { for (int x = 0; x < Xsize; ++x) { printf("%d", canvas[y][x]); } printf("\n"); } return 0; }
代码说明
1.
MAX_SIZE
定义了画布大小的上限,用于声明canvas
数组的大小。2.
canvas
二维数组用于存储画布上每个像素的颜色。3.
scanf
函数用于读取输入数据,printf
函数用于输出结果,以满足大数据量输入输出的时间要求。4.在处理每个圆时,通过计算
minX
、maxX
、minY
、maxY
来确定可能在圆内的像素范围,减少了不必要的遍历。5.判断像素是否在圆内的条件
(x - xi) * (x - xi) + (y - yi) * (y - yi) <= Ri * Ri
是根据圆的方程实现的。
- 1
信息
- ID
- 1384
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 12
- 已通过
- 1
- 上传者