1172:题目描述
给定一个m行n列的二维矩阵,求其四周边元素和。
1<=m、n<=100000,可能是1行100000列,也可能是10000行50列,但保证矩阵元素不多于500000。你可能不能预定义数组的大小了,你要学会使用动态内存分配哦。你可以动态申请m*n个内存单元,然后用一维数组来存储二维数组,二维数组元素a[i][j]对应一维数组a[i*n+j],i、j均从0开始。
输入
输入第一行是m和n,然后是一个m行n列的矩阵。
输出
输出一个整数,表示矩阵所有边界元素的和。
答案:
(非指针,答案没错,oj不过)
#include<stdio.h>
int main()
{
int m,n,i,j,sum;
scanf("%d%d",&m,&n);
int a[m][n];
for(i=0; i<m; i++)
for(j=0; j<n; j++)
scanf("%d",&a[i][j]);
if(m==1)
{
for(j=0; j<n; j++)
sum=sum+a[0][j];
printf("%d",sum);
}
else
{
for(j=j-1;j>=0;j--)
sum=sum+a[0][j]+a[i-1][j];
j=m-2;
for(i=1; i<=j; i++)
sum=sum+a[i][0]+a[i][n-1];
printf("%d",sum);
}
return 0;
}
指针版:
思路:大矩形-小矩形
二维数组元素a[i][j]对应一维数组a[i*n+j],i、j均从0开始。
#include<stdio.h>
#include<stdlib.h>
int main()
{
int m,n,*p,i,j,sum1=0,sum2=0;
scanf("%d%d",&m,&n);
p=(int *)malloc(sizeof(int)*m*n);
for(i=0; i<m; i++)
for(j=0; j<n; j++)
scanf("%d",&p[i*n+j]);
for(i=0; i<m; i++)
for(j=0; j<n; j++)
sum1=sum1+p[i*n+j];
for(i=1; i<m-1; i++)
for(j=1; j<n-1; j++)
sum2=sum2+p[i*n+j];
printf("%d",sum1-sum2);
}