题目描述
给定一个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列的矩阵。
输出
输出一个整数,表示矩阵所有边界元素的和。
样例输入
3 4
1 2 3 4
5 6 7 8
9 5 4 6
样例输出
47
tips:
1 动态申请二维数组 可以使用二级指针申请一个二维数组,可以使用一级指针申请一个二维数组
2 当知道列的个数时,可以使用数组指针来申请一个二维数组
3 题目中给出的是使用一级指针,当使用二级指针去提交一直提示访问段错误。。。
一级指针
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(){
int m, n;
int ret = 0;
int *buf;
scanf("%d%d",&m,&n);
buf = (int*)malloc(m*n*sizeof(int)); //此时的内存大小是 m*n ,相当于把二维数组展开
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++){
scanf("%d",&buf[i*n+j]); //n是列大小,利用偏移量来找到每一个元素
}
}
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++){
if (i==0||j==0||i==m-1||j==n-1)
{
ret += buf[i*n+j];
}
}
}
printf("%d\n",ret);
free(buf); //只需要释放一个一级指针
}
二级指针
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(){
int m, n;
int ret = 0;
int **buf;
scanf("%d%d",&m,&n);
buf = (int**)malloc(sizeof(int*)*m); //注意这是 int*
for (int i = 0; i < n; i++)
{
buf[i] = (int*)malloc(sizeof(int)*n);
}
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++){
scanf("%d",&buf[i][j]);
}
}
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++){
if (i == 0 || i == m - 1||j==0||j==n-1)
{
ret += buf[i][j];
}
//else if (j == 0 || j == n - 1)
//{
// ret += buf[i][j];
//}
}
}
printf("%d\n", ret);
for (int i = 0; i < m; i++)
{
free(buf[i]); //先释放一级指针
}
free(buf); //释放二级指针
}