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

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

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

  1. (0, 0)
  2. (2020, 11)
  3. (11, 14)
  4. (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;			
} 
Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐