【题解】第十一届蓝桥杯试题B:扩散·国赛B组·C/C++

题目大意:

本题总分: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;
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值