标题链接:
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
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |