C++数组(二)(算法竞赛)


🌊用有趣的言语来阐述苦涩难懂的代码世界,让每一个技术都充满风趣!

🔭个人主页: 散峰而望

🚀学习方向: C/C++等方向

📌专栏系列:

💬人生格言: 冀以尘雾之微,补益山海,荧烛末光,增辉岁月。

🎬博主简介

文章目录

  • 前言
  • [2. 二维数组](#2. 二维数组)
    • [2.1 二维数组的概念](#2.1 二维数组的概念)
    • [2.2 二维数组的创建](#2.2 二维数组的创建)
    • [2.3 二维数组的初始化](#2.3 二维数组的初始化)
    • [2.4 二维数组的下标](#2.4 二维数组的下标)
    • [2.5 二维数组元素的遍历和打印](#2.5 二维数组元素的遍历和打印)
    • [2.6 使用 memset 设置二维数组内容](#2.6 使用 memset 设置二维数组内容)
    • [2.7 练习](#2.7 练习)
  • 结语

前言

上一篇我们详细的介绍了一维数组 从创建到访问打印,以及一些其他函数的运用。接下来这一篇将会对代码中常用的二维数组一一道来,从而让各位更好的掌握这个知识热点。

2. 二维数组

2.1 二维数组的概念

上一篇我们详细的讲解了一维数组,同时了解到数组的元素都是内置类型的,如果我们把一维数组作为数组的元素,这时候的数组就是二维数组 。同理,以二维数组作为元素的数组为三维数组 ,二维数组以上的数组被称为多维数组。

2.2 二维数组的创建

二维数组的语法形式:

cpp 复制代码
type arr_name[常量值1][常量值2];

//例如:
int arr1[3][2];
char arr2[4][6];
double arr3[5][5];

解释一下上述代码中的一些关键信息:

  • 3 表示数组有 3 行
  • 2 表示每行有 2 个元素
  • int 表示元素的类型
  • arr 是数组名,可以根据需要自己设,没有特别要求

2.3 二维数组的初始化

前面我们已经了解在创建变量或数组时,需要给定一些初始值,被称为初始化。

那么二维数组该如何初始化哩?像一维数组一样,使用**大括号{}**初始化。

cpp 复制代码
//不完全初始化
int arr1[3][4] = {1,2,3};
int arr2[4][6] = {0};

//完全初始化
int arr3[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};

//按行初始化
int arr4[3][4] = {(1,2),(3,4),(5,6)};

//如果数组初始化了,数组在指定大小的时候可以省略行
//但是不能省略列
int arr5[][5] = {1,2,3};
int arr6[][5] = {1,2,3,4,5,6,7};
int arr7[][5] = {(1,2),(3,4),(5,6)};

如果这一块还是搞的不是太清楚可以跳转:基本魔法语言数组 (二)

2.4 二维数组的下标

当我们掌握了二维数组的创建和初始化,那我们应该如何使用二维数组呢?

与一维数组一样,二维数组的访问也是使用下标的形式。二维数组是有行和列,只要锁定了行和列就能锁定数组唯一的元素。

C/C++ 规定,二维数组的行是从 0 开始的,列也是从 0 开始的,如下所示:

cpp 复制代码
int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
cpp 复制代码
#include <iostream>
using namespace std;

int main()
{
	int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
	cout << arr[2][4] << endl;
	return 0;
}

演示结果:

2.5 二维数组元素的遍历和打印

二维数组和一维数组一样,想要把所有的元素都打印一遍,需要用到循环,唯一不一样的是二维数组比一维数组多一个循环用来打印列。

cpp 复制代码
#include<iostream>
using namespace std;

int main()
{
	int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
	
	for(int i = 0; i < 3; i++)
	{
		for(int j = 0; j < 5; j++)
		{
			cout << arr[i][j] << " ";
		}
		cout << endl;
	}
	return 0;
}

演示结果:

2.6 使用 memset 设置二维数组内容

再回顾一下memset 语法:

cpp 复制代码
void * memset( void * ptr, int value, size_t num);

简单而言,memset 是用来设置二维数组内存的,将其内存的值以字节为单位设置成自己想要的内容。

同时要注意使用 memset 需要包含头文件,头文件为 < cstring >。

下面演示一个例子:

cpp 复制代码
//整形形式
#include<iostream>
#include<cstring>
using namespace std;

int main()
{
	int a[10][10];
	memset(a, 0, sizeof(a));
	for(int i = 0; i < 10; i++)
	{
		for(int j = 0; j < 10; j++)
		{
			cout << a[i][j] << " ";
		}
		cout << endl;
	}
	return 0;
}

//字符形式
#include<iostream>
#include<cstring>
using namespace std;

int main()
{
	char a[10][10];
	memset(a, 'x', sizeof(a));
	for(int i = 0; i < 10; i++)
	{
		for(int j = 0; j < 10; j++)
		{
			cout << a[i][j] << " ";
		}
		cout << endl;
	}
	return 0;
}

演示结果:

2.7 练习

  1. 杨辉三角

由题目可知我们需要将杨辉三角按照下面的形式进行输出

这里我们来分析一下这些数的下标:

可以看到在数组的第 0 列输入的为 1 ,即若数组名为 arr ,则 arri0 = 1。同时我们又可以发现当 i == j 时,输入的也为 1 ,则 arrij = 1,当且仅当 i == j 时成立。边上的数我们已经分析好了,接下来来分析中间的部分。根据图我们可以发现 2 是由它正上面的数和正上面左边的数相加得来。则在 i > 1并且 j >= 1 时的元素满足

arrij = arri-1j-1 + arri-1j

计算式。之后就是循环嵌套依次输出。同时我们想输出这种梯形形状的图形我们可以根据下标,让 j <= i 时停止就能得到这种梯形图案。

代码如下:

cpp 复制代码
#include <iostream>
using namespace std;

const int N = 25;
int arr[N][N];
 
int main()
{
	int n = 0;
	cin >> n;
	for(int i = 0; i < n; i++)
	{
		for(int j = 0; j <= i; j++)
		{
			if(j == 0 || i == j)
			    arr[i][j] = 1;
			if(i >= 2 && j >= 1)
				arr[i][j] = arr[i-1][j-1] + arr[i-1][j];  
			cout << arr[i][j] << " ";   
		}
		cout << endl;
	}
	return 0;
 } 

那如果我们想要打印出这种的杨辉三角,我们要怎么搞?

这种居中的杨辉三角我们该怎么搞呢?我们发现外围打印 1 的数组下标没有楼梯的那种简单好辨识,而且中间部分的也不能依靠上面的计算式来搞,怎么办哩?

其实很简单,只用在前面加一下空格就行了,其他都不用管。那么需要多少空格哩,我们可以数一数,第一排和最后一排相差 n-1-i 个空格,之后循环就行了。

代码如下:

cpp 复制代码
#include <iostream>
using namespace std;

const int N = 25;
int arr[N][N];
 
int main()
{
	int n = 0;
	cin >> n;
	for(int i = 0; i < n; i++)
	{
		for(int j = 0; j <= n-1-i; j++)
		{
			cout << " ";
		 } 
		for(int j = 0; j <= i; j++)
		{
			if(j == 0 || i == j)
			    arr[i][j] = 1;
			if(i >= 2 && j >= 1)
				arr[i][j] = arr[i-1][j-1] + arr[i-1][j];  
			cout << arr[i][j] << " ";   
		}
		cout << endl;
	}
	return 0;
 } 

演示结果:

  1. 矩阵交换行
    根据题目我们可以知道,我们可以先输出一趟二维数组,然后交换指定的行数

所以先循环输入题目已经明确规定前五行输出矩阵,然后交换指定行数,再输出。

代码如下:

cpp 复制代码
#include<iostream>
using namespace std;

const int N = 5;
int arr[N][N];
int r1,r2;

int main()
{
	int i = 0;
	int j = 0;
	//输入 
	for(i = 0; i < N; i++)
	{
		for(j = 0; j < N; j++)
		{
			cin >> arr[i][j];
		}
	}
	//交换
	cin >> r1 >> r2;
	for(j = 0; j < N; j++)
	{
		int tmp = arr[r1-1][j];
		arr[r1-1][j] = arr[r2-1][j];
		arr[r2-1][j] = tmp;
	 } 
	//输出
	for(i = 0; i < N; i++)
	{
		for(j = 0; j < N; j++)
		{
			cout << arr[i][j] << " ";
		}
		cout << endl;
	}
	return 0;
 } 
  1. 图像相似度
  2. 矩阵转置
  3. 计算矩阵边缘元素之和
  4. 图像模糊处理
  5. 彩票摇奖

这些题目可以自己先练练手,从而更好更快的的掌握二维数组。


结语

希望这篇文章能够帮助各位能够更好的了解并掌握二维数组。作为后面码代码最常用的知识点之一,我们一定不能在这里留下疑问。同时,也要多练题巩固所学知识。下一篇我们将会对数组中玩法比较多的字符数组详细的讲解。

往期回顾:C++数组(一)(算法竞赛)

同时愿诸君能一起共渡重重浪,终见缛彩遥分地,繁光远缀天。

相关推荐
技术胖1 分钟前
奎爷巡演 AIGC 视频教程 文档
算法
德彪稳坐倒骑驴37 分钟前
Leetcode力扣刷题记录与题解
算法·leetcode·职场和发展
wangruofeng7 小时前
AI Models 模型目录,跨平台比较大模型 API 价格与上下文
github·aigc·ai编程
lzhdim7 小时前
AI的分类
人工智能·算法·机器学习·分类·数据挖掘
怕浪猫9 小时前
红利窗口开着,程序员别在场边囤课
面试·github·ai编程
来自于狂人9 小时前
GitHub 开源趋势日报 | 2026年10月21日
开源·github
凤凰院凶涛QAQ10 小时前
《Java版数据结构 & 集合类剖析》Map & Set & 反射:“从哈希碰撞到红黑树转换,反射帮你扒开 HashMap 的桶数组看个究竟”
java·数据结构·算法
H.莓飛10 小时前
【数据结构】排序_OJ题(一):计数、桶与排序后的处理
java·开发语言·数据结构
wangchunyu11410 小时前
JAVA AQS与Lock实现原理(含CAS)
java·开发语言·word
爱喝水的鱼丶11 小时前
SAP-ABAP:ECC→S/4HANA ABAP 迁移升级指南——程序改造、语法兼容与性能优化 导语
运维·开发语言·性能优化·sap·abap·经验交流·开发交流