ZZULIOJ 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列的矩陣。

輸出

輸出一個整數,表示矩陣所有邊界元素的和。

樣例輸入

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);  //釋放二級指針
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章