北航计算机机试C12年小岛面积

【北航复试】

小岛面积
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>

#define N 100

//both inside and outside are the valiable addresses.
int main()
{
    int br,i,j,num=0;

    int row[100][2];
    int col[100][2];
    int a[100][100];
    memset(row,-1,sizeof(row));
    memset(col,-1,sizeof(col));//compared with number 0


    scanf("%d",&br);
    for(i=0;i<br;i++)
    {
        for(j=0;j<br;j++)
        {
            scanf("%d",&a[i][j]);
            if(a[i][j]==1)
            {
                if(row[i][0]==-1)
                    row[i][0]=j;
                if(col[j][0]==-1)
                    col[j][0]=i;
                row[i][1]=j;
                col[j][1]=i;
            }
        }
    }
    for(i=0;i<br;i++)
    {
        for(j=0;j<br;j++)
        {
            if(a[i][j]==0)
            {
                if(j>row[i][0] && j<row[i][1] && i>col[j][0] && i<col[j][1])
                {
                    num++;
                }
            }
        }
    }
    printf("%d",num);
    return 0;
}
  • 小岛面积该题是一个基础的矩阵问题,算是查找吧,
  • 确定每行每列的边界值
  • 遍历所有的0来判断是否在该行的“墙”内,还有就是,外墙和内墙都是一样的。

不足之处,最开始定义数组时占用了100*100的内存空间,但实际不一定会用到这么多,可以用calloc来申请一定的空间,记得free()。
时间复杂度应该是o(n*n)。

p=(int*)calloc(m *n,sizeof(int));//向系统申请内存
if(p==NULL)//确保使用前是非空指针,当p为ptrnull结束程序运行
{exit(1);
}
free (p);

向系统申请了m*n个int型的存储单元,并用int型指针变量p指向这段内存的首地址,尽管它相当于建立一个二维动态数组,但因指针P是指向这个动态数组的列指针,当寻址数组元素时,必须将其当作一维数组来处理:

scanf("%d",&p[i*n+j]);
*(p+i *n+j)
全部评论

相关推荐

小浪_Coding:个人技能一条测试没有
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务