12年上机题#2

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
原文地址:https://www.cnblogs.com/kkzxak47/p/2948790.html