2.【问题描述】
小岛面积
1 1 1 1 1 1
1 1 0 0 0 1
1 0 0 0 1 0
1 1 0 1 1 1
0 1 0 1 0 0
1 1 1 1 1 1
上面矩阵的中的1代表海岸线,0代表小岛。求小岛面积(即被1包围的0的个数)。注意:仅求这样的0,该0被所在行中两个1包围,该0被所在列中两个1包围。
输入:
第一行输入一个整数N,表示输入方阵的维数
输入一个N维方阵
输出:
小岛面积
样例输入:
6
1 1 1 1 1 1
1 1 0 0 0 1
1 0 0 0 1 0
1 1 0 1 1 1
0 1 0 1 0 0
1 1 1 1 1 1
样例输出:
8
#include <stdio.h> #include <string.h> int main() { freopen("input.txt", "r", stdin); int dimension; while(scanf("%d", &dimension) != EOF) { int matrix[dimension][dimension]; int status[dimension][4]; memset(status, -1, dimension*4*sizeof(int)); int i, j; printf("original matrix: \n"); for( i = 0; i < dimension; ++i ) { for( j = 0; j < dimension; ++j ) { scanf( "%d", &matrix[i][j] ); printf( "%d ", matrix[i][j] ); } putchar('\n'); } for( i = 0; i < dimension; ++i ) for( j = 0; j < dimension; ++j ) { if( matrix[i][j] ) { if( status[i][0] == -1 ) status[i][0] = j; if( status[j][2] == -1 ) status[j][2] = i; status[i][1] = j; status[j][3] = i; } } printf("status array: \n"); for( i = 0; i < dimension; ++i ) { for( j = 0; j <= 3; ++j ) printf("%d ", status[i][j]); putchar('\n'); } int counter = 0; for( i = 0; i < dimension; ++i ) for( j = 0; j < dimension; ++j ) { if(!matrix[i][j] ) if( j > status[i][0] && j < status[i][1] && i > status[j][2] && i < status[j][3] ) ++counter; } printf("area: %d\n\n", counter); } fclose(stdin); return 0; }
难点在于统计每行每列起始‘1’所在位置,答案很精巧,学习了。
input.txt
6 1 1 1 1 1 1 1 1 0 0 0 1 1 0 0 0 1 0 1 1 0 1 1 1 0 1 0 1 0 0 1 1 1 1 1 1 7 1 1 1 0 1 1 1 1 0 0 1 0 1 1 1 0 0 0 1 0 1 1 1 0 0 1 1 0 0 1 0 1 0 1 0 1 1 1 0 1 1 0 1 1 0 1 0 1 1
结果:
original matrix: 1 1 1 1 1 1 1 1 0 0 0 1 1 0 0 0 1 0 1 1 0 1 1 1 0 1 0 1 0 0 1 1 1 1 1 1 status array: 0 5 0 5 0 5 0 5 0 4 0 5 0 5 0 5 1 3 0 5 0 5 0 5 area: 8 original matrix: 1 1 1 0 1 1 1 1 0 0 1 0 1 1 1 0 0 0 1 0 1 1 1 0 0 1 1 0 0 1 0 1 0 1 0 1 1 1 0 1 1 0 1 1 0 1 0 1 1 status array: 0 6 0 6 0 6 0 6 0 6 0 5 0 5 1 6 1 5 0 5 0 5 0 6 0 6 0 6 area: 12