美文网首页
【C/C++】求水面面积

【C/C++】求水面面积

作者: 仍有不归期 | 来源:发表于2020-06-06 00:21 被阅读0次

这些题目都是大一刚入学时学习C语言的课后作业,在OJ上看到还保留着,就都整理下发出来吧......(只有题和代码)

【问题描述】

用一个二维方阵(最小为3X3,最大为9X9)表示一片海域。方阵中的元素只由0和1组成。1表示海岸线。计算水面面积(即:不在1围起来的区域中0的个数)。如下图所示6X6方阵表示的水面面积为14:
0 0 0 1 0 0
0 0 1 0 1 0
0 1 0 0 0 1
1 0 0 0 1 0
1 0 1 0 1 0
1 1 0 1 0 0
上述方阵表示的海域满足下面两个要求:
1、小岛只有一个。
2、用1表示的海岸线是封闭的,但有可能是凸的,也有可能是凹的。

提示:
对于方阵中的任意一个元素0,如果其位于同一行上的两个1之间,并且位于同一列上的两个1之间,则该元素肯定在1围起来的区域中。否则就不在1围起来的区域中,即属于水面。

【输入形式】

先从标准输入中输入方阵的阶数,然后从下一行开始输入方阵的元素(只会输入0或1),各元素之间以一个空格分隔,每行最后一个元素后没有空格,但会有回车换行符。

【输出形式】

在标准输出上输出用整数表示的水面面积。

【输入样例】

6
0 0 0 1 0 0
0 0 1 0 1 0
0 1 0 0 0 1
1 0 0 0 1 0
1 0 1 0 1 0
1 1 0 1 0 0

【输出样例】

14

【样例说明】

输入是6X6的方阵。该方阵中不在1围起来的区域中0的个数为14,所以输出的小岛面积为14。注意:最下方的三个元素1(即第5行第3列的1、第6行第2列的1、第6行第4列的1)组成了一个凹形的海岸线,第6行第3列的0不在海岸线内,所以应算作水面面积。

【评分标准】

该题要求输出用整数表示的水面面积,共有5个测试点,提交程序文件名为area.c。

【代码】

#include<stdio.h>

int main()
{
    int area[9][9];
    int i,j;
    i = j = 0;  
    int n;
    scanf("%d",&n);
    
    for(i = 0;i < n;i++)
    {
        for(j = 0;j < n;j++)
        {
            scanf("%d",&area[i][j]);
        }
    }
    
    int m = 0;
    int num = 0;
    int l,r,u,d;
    l = r = u = d = 0;
    for(i = 0;i < n;i++)
    {
        for(j = 0;j < n;j++)
        {
            if(area[i][j] == 0)
            {
                for(m = 0;m < n;m++)
                {
                    if(j - m >= 0)
                    {
                        if(area[i][j - m] == 1 )
                        {
                            l = 1;
                        }
                    }
                    if(j + m < n)
                    {
                        if(area[i][j + m] == 1) 
                        {
                            r = 1;
                        }
                    }
                    if(i + m < n)
                    {
                        if(area[i + m][j] == 1 )
                        {
                            u = 1;
                        }
                    }
                    if(i - m >= 0)
                    {
                        if(area[i - m][j] == 1 )
                        {
                            d = 1;
                        }
                    }
                }
                if(l==1&&u==1&&d==1&&r==1)
                {
                    l = r = u = d = 0;
                }
                else
                {
                    num++;
                    l = r = u = d = 0;
                }   
            }
            
        }
    }
    printf("%d",num);
    
    return 0;
}

PS:由于当时刚学C语言,很多代码显得很稚嫩...需要的人见谅...

相关文章

网友评论

      本文标题:【C/C++】求水面面积

      本文链接:https://www.haomeiwen.com/subject/tkbpzhtx.html