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 ,则 arr[i][0] = 1。同时我们又可以发现当 i == j 时,输入的也为 1 ,则 arr[i][j] = 1,当且仅当 i == j 时成立。边上的数我们已经分析好了,接下来来分析中间的部分。根据图我们可以发现 2 是由它正上面的数和正上面左边的数相加得来。则在 i > 1并且 j >= 1 时的元素满足

arr[i][j] = arr[i-1][j-1] + arr[i-1][j]

计算式。之后就是循环嵌套依次输出。同时我们想输出这种梯形形状的图形我们可以根据下标,让 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++数组(一)(算法竞赛)

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

相关推荐
leoufung7 分钟前
LeetCode 92 反转链表 II 全流程详解
算法·leetcode·链表
Porunarufu8 分钟前
Java·关于List
java·开发语言
子不语18038 分钟前
Python——函数
开发语言·python
wyhwust44 分钟前
交换排序法&冒泡排序法& 选择排序法&插入排序的算法步骤
数据结构·算法·排序算法
利刃大大1 小时前
【动态规划:背包问题】完全平方数
c++·算法·动态规划·背包问题·完全背包
ndjnddjxn1 小时前
Rust学习
开发语言·学习·rust
月光技术杂谈1 小时前
实战:C驱动框架嵌入Rust模块的互操作机制与完整流程
c语言·开发语言·rust·ffi·跨语言·bindgen·互操作
t198751281 小时前
基于MATLAB的指纹识别系统完整实现
开发语言·matlab
wyhwust1 小时前
数组----插入一个数到有序数列中
java·数据结构·算法