#C 扩散
本题总分:10 分
问题描述
小蓝在一张无限大的特殊画布上作画。
这张画布可以看成一个方格图,每个格子可以用一个二维的整数坐标表示。
小蓝在画布上首先点了一下几个点:(0 00, 0 00),(2020 20202020, 11 1111),(11 1111, 14 1414),(2000 20002000, 2000 20002000)。只有这几个格子上有黑色,其它位置都是白色的。
每过一分钟,黑色就会扩散一点。具体的,如果一个格子里面是黑色,它就会扩散到上、下、左、右四个相邻的格子中,使得这四个格子也变成黑色(如果原来就是黑色,则还是黑色)。
请问,经过 2020 20202020 分钟后,画布上有多少个格子是黑色的。
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
11157392 || 20312088
calcCode:
public class Test {
static final int n = 2020;
public static void main(String[] args) {
int[][] resource = { {0, 0}, {2020, 11}, {11, 14}, {2000, 2000} };
boolean[][] marked = new boolean[n << 1 | 1][n << 1 | 1];
long res = 0;
for (int k = 0, x, y; k < 4; k++) {
x = resource[k][0];
y = resource[k][1];
for (int i = -n; i <= n; i++) {
if (x + i < 0) continue;
for (int r = n - abs(i), j = -r; j <= r; j++) {
if (x + i < 0 || y + j < 0 || marked[x + i][y + j]) continue;
marked[x + i][y + j] = true;
res++;
}
}
}
System.out.println(res);
}
static int abs(int n) { return n > 0 ? n : -n; }
}
反正比赛的时候我填的是这个结果
但还有人说这里的扩散可以扩散到负坐标,防杠还是写出来吧
public class Test {
static final int n = 2020;
public static void main(String[] args) {
int[][] resource = { {0, 0}, {2020, 11}, {11, 14}, {2000, 2000} };
boolean[][] marked = new boolean[n << 2][n << 2];
long res = 0;
for (int k = 0, x, y; k < 4; k++) {
x = resource[k][0] + n;
y = resource[k][1] + n;
for (int i = -n; i <= n; i++)
for (int r = n - abs(i), j = -r; j <= r; j++) {
if (marked[x + i][y + j]) continue;
marked[x + i][y + j] = true;
res++;
}
}
System.out.println(res);
}
static int abs(int n) { return n > 0 ? n : -n; }
}
以上是《Java 蓝桥杯 国赛 第十一届 C组 试题A:美丽的 2》的全部内容,
感谢您对程序员阿鑫博客的支持!
版权说明
文章采用: 《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权。版权声明:未标注转载均为本站原创,转载时请以链接形式注明文章出处。如有侵权、不妥之处,请联系站长删除。敬请谅解!