问题描述
小蓝在一张 无限大
的特殊画布上作画。
这张画布可以看成一个方格图,每个格子可以用一个二维的整数坐标表示。
小蓝在画布上首先点了一下几个点:
- (0, 0)
- (2020, 11)
- (11, 14)
- (2000, 2000)
只有这几个格子上有黑色,其它位置都是白色的,每过一分钟,黑色就会扩散一点。
具体的,如果一个格子里面是黑色,它就会扩散到上、下、左、右四个相邻的格子中,使得这四个格子也变成黑色
(如果原来就是黑色,则还是黑色)。
请问,经过 2020 分钟后,画布上有多少个格子是黑色的。
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。
本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
答案:20312088
题解
多源BFS:
由于 (0, 0)
会向负坐标扩展,所以要将四个点都向右下角平移足够的多的位置。
#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;
}