[蓝桥杯]第十一届决赛B组试题解析_试题 历届真题 补给【第十一届】【决赛】【b组】python

题目链接:

https://www.lanqiao.cn/problems/1018/learning/

B 扩散

题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

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

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

小蓝在画布上首先点了一下几个点:(0,0),(2020,11),(11,14),(2000,2000)。

只有这几个格子上有黑色,其它位置都是白色的。

每过一分钟,黑色就会扩散一点。具体的,如果一个格子里面是黑色,它就会扩散到上、下、左、右四个相邻的格子中,使得这四个格子也变成黑色(如果原来就是黑色,则还是黑色)。

请问,经过 2020 分钟后,画布上有多少个格子是黑色的。

题解:

在这道题中,我们需要注意 扩散的方向是垂直方向即(上下左右),且每过一分钟就会扩散一个距离,题目要求2020分钟之后,即在单个方向上,扩散的距离为2020,即使题目上说坐标是无限大的,但是由于条件限制,我们是可以模拟出坐标的:

四个点经过2020分钟的扩散,情况如下
在这里插入图片描述
通过上面的扩散情况,我们发现坐标的范围其实在 x轴属于(0-2020,2000+2020) , y轴属于(0-2020,2020+2020)

我们仅仅需要用一个二位数组表示坐标系(未扩散到的地方用0表示,扩散到的地方用1标识),每过一分钟,从四个点的位置处扩散,2020分钟扩散完毕之后,判断二维数组中1的个数即可

代码:

#include<iostream>
#include<queue>
using namespace std;
struct node{
	node(int _x,int _y,int _cnt)
	:x(_x)
	,y(_y)
	,cnt(_cnt)
	{
	}
    int x , y , cnt;
    //cnt记录本次移动是第几次移动
};
//因为有的编程语言中数组坐标不支持负数,所以我们整体加上2020

int nex[4][2] = {
  {1 , 0} , {-1 , 0} , {0 , 1} , {0 , -1}};
const int row=2020+2020+2020+1;
const int col=2000+2020+2020+1;
const int B = 2020;
int map[row][col];
int bfs()
{
    queue<node> que;
    int cnt = 4; // 初始的黑色的点的个数 
    //我们需要使用队列来记录我们需要从那个点进行方向移动
    que.push(node(0 + B , 0 + B , 0));
    que.push(node(2020 + B , 11 + B , 0));
    que.push(node(2000 + B , 2000 + B , 0));
    que.push(node(11 + B , 14 + B , 0));
    map[0 + B][0 + B] = 1;
    map[2020 + B][11 + B] = 1;
    map[2000 + B][200
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值