題目描述
給定一個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); //釋放二級指針
}