题目描述
编程计算由‘*’号围成的下列图形的面积。面积的计算方法是统计*号所围成
的闭合曲线中水平线和垂直线交点的数目。如图所示,在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
输入
一个10*10 的二维数组, 里面的数为0 和1,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
样例输出
15
这道题可以用宽搜来解决。
先开两个队列,用来存走过的每一个点的坐标。之后直接计算闭合区间的面积是很费劲的,但是如果把这个面积之外到整个边界的数都转换成“1”的话,就可以直接算“0”的个数,就是图形的面积了。
所以:
#include<iostream> #include<cstdio> #include<queue> using namespace std; int map[15][15]; int nx[5] = {0,0,1,-1}; int ny[5] = {1,-1,0,0}; queue <int> x; queue <int> y; void bfs(int a,int b) { x.push(a); y.push(b); while(x.empty() == 0) { for(int i = 0; i < 4; i++) { if(x.front() + nx[i] <=11&&x.front() + nx[i] >= 0&&y.front() + ny[i] <= 11&&y.front() + ny[i] >= 0&&map[x.front() + nx[i]][y.front() + ny[i]] == 0) { x.push(x.front() + nx[i]); y.push(y.front() + ny[i]); map[x.front() + nx[i]][y.front() + ny[i]] = 1; } } x.pop(); y.pop(); } } int main() { //freopen("area.in","r",stdin); //freopen("area.out","w",stdout); int num; for(int i = 1; i <= 10; i++) { for(int j = 1; j <= 10; j++) scanf("%d",&map[i][j]); } bfs(0,0); for(int i = 0; i <= 11; i++) { for(int j = 0; j <= 11; j++) { if(map[i][j] == 0) num++; } } cout<<num<<endl; return 0; }