这些题目都是大一刚入学时学习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;
}
网友评论