题目
题目描述
编程计算由“ * ”号围成的下列图形的面积。面积计算方法是统计*号所围成的闭合曲线中水平线和垂 直线交点的数目。如下图所示,在 10 * 10 的二维数组中,有“ * ”围住了 15 个点,因此面积为 15。
0 0 0 0 0 0 0 0 0 0
0 0 0 0 * * * 0 0 0
0 0 0 0 * 0 0 * 0 0
0 0 0 0 0 * 0 0 * 0
0 0 * 0 0 0 * 0 * 0
0 * 0 * 0 * 0 0 * 0
0 * 0 0 * * 0 * * 0
0 0 * 0 0 0 0 * 0 0
0 0 0 * * * * * 0 0
0 0 0 0 0 0 0 0 0 0
输入格式
一个矩阵。
输出格式
面积
样例
样例输入
0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 1 1 0 0 0
0 0 0 0 1 0 0 1 0 0
0 0 0 0 0 1 0 0 1 0
0 0 1 0 0 0 1 0 1 0
0 1 0 1 0 1 0 0 1 0
0 1 0 0 1 1 0 1 1 0
0 0 1 0 0 0 0 1 0 0
0 0 0 1 1 1 1 1 0 0
0 0 0 0 0 0 0 0 0 0
样例输出
15
思路:
我们不妨想象输入为一个地形图,需要求的面积即为一块被墙(‘1’)围起来的地,现在我们在墙外倒水(假设水无限多),一段时间后,没被水淹的部分的面积即为所求;
现在我们模拟倒水的过程即可:
1.在哪倒水?
有人会说在 左上角/左下角/右上角/右下角 倒水,但这都不好,因为如果这样,水就有可能倒到墙上QAQ
所以我们不妨在这块地的周围再加一圈‘0’,然后在新地的 左上角/左下角/右上角/右下角 倒水,至于你要真想在新地的一个对你有特殊意义的地方倒水比如…250,我也无话可说,但要注意一定要在新加的一圈地上倒,否则就白搭。
2.水不能流遍该流的地方怎么办
我知道,你们是在担心这种毒瘤数据:
0 0 0 1 0 0 0 0 0 0
0 0 1 0 1 0 0 0 0 0
0 0 1 0 0 1 0 0 0 0
0 1 0 0 0 1 0 0 0 0
1 0 0 0 0 0 1 0 0 0
0 1 1 1 1 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
如果这样你还选择在左上角倒水,水就只会被堵在左上角一块,统计的时候就GG了,还是刚才那招,在这块地的周围加一圈‘0’,这样新加的一圈就起到了连通的作用, 香 。
代码实现大致思路
1.首先你需要在这块地的周围加一圈‘0’
2.然后你需要一个BFS/DFS函数,用来模拟流水过程
3.最后统计没被水淹的部分,完成!!!
代码
#include<cstdio>
#include<iostream>
using namespace std;
int arr[15][15];
void bfs(int i,int j)