编译环境:

Kali Linux 

Ubuntu Linux

Windows 10 

效果图:

微信图片_20181224153041.png

解题思路:

这题方法应该有很多,我通过观察数据之间的关系找到了一种感觉比较好理解的方法。先声明一下

 当输入5进行测试时,输出

1   3  6  10  15

2   5  9   14

4   8  13 

7   12 

11 

输出的第一行1 3 6 10 15 。如果用二维数组存储的话,第一行的数据的行标都是0哟,如a[0][1]  a[0][2]  a[0][3]等。a[0][0]=1,a[0][1]=a[0][0]+2,a[0][2]=a[0][1]+3,a[0][3]=a[0][2]+4......

所以可以给第一行的数据先赋值。

//二维数组第一行元素赋值
int temp=2;  a[0][0]=1;
for(int i=0; i<N; i++)
{
        a[0][i]=a[0][i-1]+temp;
        temp+=1;   
}

从第二行元素开始,每个元素的值等于其右上角元素值-1。即a[i][j]=a[i-1][j+1]-1

1   3  6  10  15

2   5  9   14

4   8  13 

7   12 

11

如看上图中2和3的关系 a[1][0]=a[0][1]-1等。



注意事项:
需要注意的问题就是如何让输出的是一个矩阵的左上角

当输入5时,输出5X5的矩阵的左上角。

左上角的元素的下标如下

00 01 02 03 04

10 11 12 13 

20 21 22 

30 31 

40

发现矩阵左上角的元素的下标之和都是小于等于矩阵两条对角线交点的a[2][2]的下标之和。

a[N][N]矩阵中间点的下标之和为 (N+N-2)/2 

所以输出矩阵的左上角满足的条件是 i+j<=(N+N-2)/2;


关于二维数组的使用:

(1)使用一个足够大的二维数组可存储数据(最简单)。

(2)使用指针动态开辟二维数组

(3)C++ Vector容器创建"二维数组"

先来说一下第(3)种:

如果开辟M行N列

则语法如下:

vector<vector<int> > vecInt(M,vector<int>(N));
注意> >之间有空格,不然会被认为是>>运算符重载。

第(2)种

int **p=(int*)malloc(sizeof(int**)*M);
for(int i=0; i<M; i++)
{
        a[i]=(int*)malloc(sizeof(int*)*N);
}

参考代码:

#include <iostream>
#include <vector>
using namespace std;
int main()
{
	int N,temp=2;
	cin>>N;
	//vector容器开辟二维数组
	vector<vector<int> > a(N,vector<int>(N));
	a[0][0]=1; 
	for(int j=1; j<N; j++)
	{	
		a[0][j]+=a[0][j-1]+temp;
		temp+=1;
	}
	for(int i=1; i<N; i++)
	{
		for(int j=0; j<N; j++)
		{
			if(i+j<=(N+N-1)/2)  //矩阵左上角
			{
				a[i][j]=a[i-1][j+1]-1;
			}
		}
	}
	for(int i=0; i<N; i++)         //输出
	{
		for(int j=0; j<N; j++)
		{
			if(i+j<=(N+N-1)/2)  
			{
				cout<<a[i][j]<<" ";
			}
		}
		cout<<endl;
	}
	return 0;
}


点赞(2)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论