zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    DAT批处理文件语法
    TreeView控件问题汇总
    windows xp home安装iis
    【Vegas原创】网站计数器(asp)
    转载:shell python脚本互调
    转载:linux的文件属性和权限学习——分析ls命令结果
    python 正则表达式匹配中文
    Python正则表达式
    linux命令备份
    移植算法编译环境到linux【redhat9.0如何显示汉字】
  • 原文地址:https://www.cnblogs.com/kkzxak47/p/2948790.html
Copyright © 2011-2022 走看看