题目大意:
本题总分:5 分
【问题描述】
小蓝在一张无限大的特殊画布上作画。
这张画布可以看成一个方格图,每个格子可以用一个二维的整数坐标表示。
小蓝在画布上首先点了一下几个点:(0, 0), (2020, 11), (11, 14), (2000, 2000)。
只有这几个格子上有黑色,其它位置都是白色的。
每过一分钟,黑色就会扩散一点。具体的,如果一个格子里面是黑色,它
就会扩散到上、下、左、右四个相邻的格子中,使得这四个格子也变成黑色
(如果原来就是黑色,则还是黑色)。
题目分析:
我们可以利用BFS的特点,按层搜素,来解决这道题目。
而这里的层次实际上就是:时间。按照时间来推移扩展这些点。
然后每次扩展出一个点,ans(统计点的个数的变量)++。
这里坐标是(0,0)而题目要求是:画布是无限大的,所以将坐标往中心移动一次,这样答案不变,但是却能让计算机处理这个问题了。
下面是本程序的详细代码。
代码详解:
#include <iostream>
#include <queue>
using namespace std;
#define Max_N 10005
#define ADD 2021
typedef pair<int, int> P;//记录点的坐标
int map[Max_N][Max_N] = {0};//保存这个点的时间,并且利用是不是-1判断有没有访问过这个点
long long ans = 4;//扩展出的点的个数
int dx[5] = {0, 0, 1, -1};
int dy[5] = {-1, 1, 0, 0};
int main() {
memset(map, -1, sizeof(map)); // map设置为-1代表没有访问过。map存放的值是:时间
queue<P> Que;//标准的BFS模板
Que.push(P(0 + ADD, 0 + ADD));//这里将坐标从边缘往中间移动
map[0 + ADD][0 + ADD] = 0;
Que.push(P(2020 + ADD, 11 + ADD));
map[2020 + ADD][11 + ADD] = 0;
Que.push(P(11 + ADD, 14 + ADD));
map[11 + ADD][14 + ADD] = 0;
Que.push(P(2000 + ADD, 2000 + ADD));
map[2000 + ADD][2000 + ADD] = 0;
while (!Que.empty()) {
int ix = Que.front().first, iy = Que.front().second;
Que.pop();
if (map[ix][iy] == 2020) {//如果这个点的时间已经是2020,就不从这个点继续扩展。
continue;
}
for (int ddt = 0; ddt < 4; ddt++) {//朝着四个方向扩展
int tx = ix + dx[ddt], ty = iy + dy[ddt];
if (map[tx][ty] == -1) {
Que.push(P(tx, ty));
map[tx][ty] = map[ix][iy] + 1;
ans++;
}
}
}
cout << ans << endl;
return 0;
}

370

被折叠的 条评论
为什么被折叠?



