测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A40203. 扩散

填空题 困难

题目描述

扩散

题目描述

小蓝在一张 无限大 的特殊画布上作画。

这张画布可以看成一个方格图,每个格子可以用一个二维的整数坐标表示。

小蓝在画布上首先点了一下几个点:

1.(0, 0)

2.(2020, 11)

3.(11, 14)

4.(2000, 2000)

只有这几个格子上有黑色,其它位置都是白色的,每过一分钟,黑色就会扩散一点。

具体的,如果一个格子里面是黑色,它就会扩散到上、下、左、右四个相邻的格子中,使得这四个格子也变成黑色

(如果原来就是黑色,则还是黑色)。

请问,经过 2020 分钟后,画布上有多少个格子是黑色的。

答案提交

这是一道结果填空的题,你只需要算出结果后提交即可。

本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

参考答案

#include <iostream> #include <cstring> #include <queue> using namespace std; struct node { int x, y; }; char g[10000][10000]; int dist[10000][10000]; int dx[4] = {-1, 0, 1, 0}; int dy[4] = {0, 1, 0, -1}; void bfs() { memset(dist, -1, sizeof dist); queue<node> q; q.push({3000, 3000}); dist[3000][3000] = 0; q.push({5020, 3011}); dist[5020][3011] = 0; q.push({3011, 3014}); dist[3011][3014] = 0; q.push({5000, 5000}); dist[5000][5000] = 0; while(q.size()) { node t = q.front(); q.pop(); if(dist[t.x][t.y] == 2020) return; for (int i = 0; i < 4; i ++) { int a = t.x + dx[i], b = t.y + dy[i]; if(a < 0 || a > 10000 || b < 0 || b > 10000) continue; if(g[a][b] == '*' || dist[a][b] != -1) continue; g[a][b] = '*'; q.push({a, b}); dist[a][b] = dist[t.x][t.y] + 1; } } } int main() { for (int i = 0; i < 10000; i ++) for (int j = 0; j < 10000; j ++) g[i][j] = '.'; g[3000][3000] = '*'; g[5020][3011] = '*'; g[3011][3014] = '*'; g[5000][5000] = '*'; bfs(); int ans = 0; for (int i = 0; i < 10000; i ++) for (int j = 0; j < 10000; j ++) if(g[i][j] == '*') ans ++; cout << ans << endl; return 0; }

答案解析

答案:20312088

上一题 下一题