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);  //释放二级指针
}

 

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