题目描述
一幅图由0和×组成,编程计算由“×”号所围成的图形的面积。面积的计算方法是统计×号所围成的闭合曲线中0的数目。
输入输出格式
输入格式
由0,×组成的图(最多10行,每行不超过200个字符)。
输出格式
一行,一个整数,为面积数。
输入输出样例
输入样例
000000000
0000**000
000*00*00
00*000*00
000***000
000000000
输出样例
5
题解
先给外围的所有点染成*,然后枚举每一个点判断是否是0即可。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#include <iostream> #include <cstdio> #include <cstring> #define MAX_M (10 + 5) #define MAX_N (200 + 5) using namespace std; int m, n; char a[MAX_M][MAX_N]; const int dx[4] = {0, 0, -1, 1}, dy[4] = {-1, 1, 0, 0}; int ans; void DFS(int x, int y) { a[x][y] = '*'; for(register int i = 0; i < 4; ++i) { if(a[x + dx[i]][y + dy[i]] == '0') { DFS(x + dx[i], y + dy[i]); } } return; } int main() { scanf("%s", a[1] + 1); m = 1; n = strlen(a[1] + 1); while(~scanf("%s", a[m + 1] + 1)) { ++m; } for(register int i = 1; i <= m; ++i) { if(a[i][1] == '0') { DFS(i, 1); } if(a[i][n] == '0') { DFS(i, 1); } } for(register int i = 1; i <= n; ++i) { if(a[1][i] == '0') { DFS(1, i); } if(a[m][i] == '0') { DFS(m, i); } } for(register int i = 1; i <= m; ++i) { for(register int j = 1; j <= n; ++j) { if(a[i][j] == '0') ++ans; } } printf("%d", ans); return 0; }