Problem Description
编程计算由“*”号围成的下列图形的面积。面积计算方法是统计*号所围成的闭合曲线中水平线和垂直线交点的数目。如下所示,在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 * * * 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
Input
输入有多组数据,每组数据是10*10的二维数组。
Output
对于每组数据输出面积。
Sample Input
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
Sample Output
15
/* 解题报告:把边界的0全部赋值为-1,然后进行两次遍历,从上往下,在从下往上; 在遍历时,当前位置为0,如果上,下,左,右有一个是-1,则把当前的 0更改为-1; 遍历完后,在记录0的个数,就是所求的结果。 */ //标程: #include<stdio.h> #include<string.h> int p[20][20]; int main() { //freopen("a.txt","r",stdin); int k; while(scanf("%d",&k)!=EOF) { memset(p,0,sizeof(p)); p[1][1]=k; int i,j,cnt=0; for(i=1;i<=10;i++) { if(i==1) for(j=2;j<=10;j++) scanf("%d",&p[i][j]); else for(j=1;j<=10;j++) scanf("%d",&p[i][j]); } for(i=1;i<=10;i++) { if(p[1][i]==0) p[1][i]=-1; if(p[10][i]==0) p[10][i]=-1; if(p[i][10]==0) p[i][10]=-1; if(p[i][1]==0) p[i][1]=-1; } for(i=1;i<=10;i++) for(j=1;j<=10;j++) if(p[i][j]==0 && (p[i][j+1]==-1 || p[i][j-1]==-1 || p[i-1][j]==-1 || p[i+1][j]==-1)) p[i][j]=-1; for(i=10;i>0;i--) for(j=10;j>0;j--) if(p[i][j]==0 && (p[i][j+1]==-1 || p[i][j-1]==-1 || p[i-1][j]==-1 || p[i+1][j]==-1)) p[i][j]=-1; for(i=1;i<=10;i++) for(j=1;j<=10;j++) if(p[i][j]==0) cnt++; printf("%d\n",cnt); } return 0; }