问题描述
小蓝在一张无限大的特殊画布上作画。
这张画布可以看成一个方格图,每个格子可以用一个二维的整数坐标表示。
小蓝在画布上首先点了一下几个点:(0, 0), (2020, 11), (11, 14), (2000, 2000)。
只有这几个格子上有黑色,其它位置都是白色的。
每过一分钟,黑色就会扩散一点。具体的,如果一个格子里面是黑色,它就会扩散到上、下、左、右四个相邻的格子中,使得这四个格子也变成黑色(如果原来就是黑色,则还是黑色)。
请问,经过 2020 分钟后,画布上有多少个格子是黑色的。
答案:20312088
题解:多源bfs
从四个点分别上下左右进行搜索
注意:画布无限大
#include<iostream>
using namespace std;
const int N = 2100;
bool book[10000][10000];
struct node
{
int x, y, s;
}que[25000000];
int main(){
book[0 + N][0 + N] = 1;
book[2020 + N][11 + N] = 1;
book[11 + N][14 + N] = 1;
book[2000 + N][2000 + N] = 1;
int head = 0, tail = 0;
que[tail].x = N;
que[tail ++].y = N;
que[tail].x = 2020 + N;
que[tail ++].y = 11 + N;
que[tail].x = 11 + N;
que[tail ++].y = 14 + N;
que[tail].x = 2000 + N;
que[tail ++].y = 2000 + N;
int next[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
while(head < tail){
if(que[head].s < 2020){
for(int k = 0; k < 4; k ++){
int tx = que[head].x + next[k][0], ty = que[head].y + next[k][1];
if(book[tx][ty] == 0){
book[tx][ty] = 1;
que[tail].x = tx;
que[tail].y = ty;
que[tail].s = que[head].s + 1;
tail ++;
}
}
}
head++;
}
cout << tail << endl;
system("pause");
return 0;
}