nkoj3632面积(搜索 )
问题描述
编程计算由“1”围成的下列图形的面积。面积计算方法是统计"1"所围成的闭合曲线中水平线和垂直线交点的数目。如右下图所示,在10*10的二维数组中,有“1”围住了15个点,因此面积为15。
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
输入格式
由数字0和1构成的一个10*10的矩阵
输出格式
一个整数,表示所求面积
样例输入
样例输入1:
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
样例输入2:
0 1 1 1 1 1 1 1 1 0
1 0 0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 0 0 1
0 1 1 1 1 1 1 1 1 0
样例输出
样例输出1:
15
样例输出2:
64
一点小想法
要想直接算出面积来肯定是不容易的,因此换一个角度思考。它想让我们算被一围住的部分的面积,我们就可以用总面积减去没被围住的面积,如此我们只需要算出没有被围住的所有连通分量。而要求这些分量,我们可以以正方形的四条边上的每一个点作为起点来深搜,由于被围住的图形一定是封闭的,所以从四周搜一定不会影响到答案的正确性。
代码
#include <cstdio>
#include <algorithm>
#include <iostream>
using namespace std;
const int Max = 10 + 5;
char g[Max][Max];
int ans