数据结构:数组

数组是计算机最基础的一个数据结构,只要你学计算机都避不开这个看似简单却无比重要东西。

例题

Openjudge7741 矩阵交换行

描述
给定一个5*5的矩阵(数学上,一个r×c的矩阵是一个由r行c列元素排列成的矩形阵列),将第n行和第m行交换,输出交换后的结果。

输入
输入共6行,前5行为矩阵的每一行元素,元素与元素之间以一个空格分开。 第6行包含两个整数m、n,以一个空格分开。(1 <= m,n <= 5)

输出
输出交换之后的矩阵,矩阵的每一行元素占一行,元素之间以一个空格分开。

样例输入

1 2 2 1 2
5 6 7 8 3
9 3 0 5 3
7 2 1 4 6
3 0 8 2 4
1 5

样例输出

3 0 8 2 4
5 6 7 8 3
9 3 0 5 3
7 2 1 4 6
1 2 2 1 2

数组

数组,顾名思义就是把一堆元素按照一定顺序组合在一起形成一个组织,这个组织就是一个数组,这里要注意数组不一定非要是数字,比如字符数组、结构体数组、bool数组等等都是数组。

在C++中构造数组的方法非常简单

Type array[limit];
Type array[limit] = {num0, num1, num2, ......};

这之中Type就是类型,比如说可以是int,bool,char,string,你建立的结构体......,array可以修改成你想赋予这个数组的名字,limit就是数组元素个数的上限。

这里详细说一下limit,记住计算机中数组是从第0位开始算的,比如说我定义一个数组a[100],那么你可以使用这个数组从a[0] ~ a[99]这100个位置,但是记住a[100]这个位置及其往后的位置是不可以使用的,如果你仅定义了一个数组a[100],而且还在程序中去给a[100]赋值的话,恭喜你成功RE了。但是平时我们比较习惯从1开始数数,就像你小时候练习掰手指头数数,没什么人会从0开始数吧。因此往往我们会省略a[0]这个位置,并把上限开大一些,比如开到a[100 + 10],之后直接用a[1] ~ a[100]。

这里再解释一下第二种a[limit] = {num0, num1, num2, ......}的构造方法,这个就是赋初始值了,其实就是让a[0] = num0,a[1] = num1,a[2] = num2,……这里也要注意第一个数num0是在给a[0]赋值。

接着数组的使用就简单多了,其实每一个数组的元素a[x]我们就可以把它看成一个单独的元素,我们可以对它进行赋值、进行四则运算……进行各种处理。

讲到这儿你可能认为数组的知识就到此结束了,那么你就大错特错了,我们都知道循环是可以嵌套的,那么数组能不能嵌套呢?当然可以,其实我们之前所说的都是一维数组,那么有一维数组就一定有二维数组。

Type array[limit1][limit2];
Type array[limit1][limit2] = {{num00, num01, ……}, {num10, num11, ……}, ……};

二维数组其实就是把每一个数组看成一个元素,之后把这些数组按照一定顺序组合成一个新的数组,那么这个数组就叫二维数组。其中数组元素是a[0] [0] ~ a[limit1 - 1] [limit2 - 1],也是从0开始算。而第二种构造方array[limit1] [limit2] = {{num00, num01, ……}, {num10, num11, ……}, ……},其实和一维数组的第二种构造是极为相似的,只不过把数组的元素换成了一个一维数组。使用的话,也非常简单,直接用a[x] [y]就行了。

了解了二维数组你可能会提出疑问,那有没有三维数组甚至更多呢?当然有,你想要多少维就可以建多少维只要内存开的下。这里举个例子,我们可以把一维数组就当成一个列表,二维数组就是一个平面上的网格,三维数组就是一个立体空间里的箱子,再往后的话你可以自己去想象了。使用方法的话举一反三就行了,这里不细说了。

唠叨了这么一大坨,最后再返回来看这道例题,其实就是一道水题,建立一个二维数组,之后交换相应行,输出就完了,时间复杂度就两重循环:O(n^2)级别。

代码

# include <cstdio>
# include <algorithm>
# include <cstring>
# include <cmath>

using namespace std;

const int N_MAX = 5;

int a[N_MAX + 10][N_MAX + 10];
int n, m;

int main()
{
	for (int i = 1; i <= N_MAX; i++)
		for (int j = 1; j <= N_MAX; j++)
			scanf("%d", &a[i][j]);
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= N_MAX; i++)
		swap(a[n][i], a[m][i]);
	for (int i = 1; i <= N_MAX; i++) {
		for (int j = 1; j <= N_MAX; j++)
			printf("%d ", a[i][j]);
		printf("
");
	}
	return 0;
}
原文地址:https://www.cnblogs.com/000zwx000/p/12451109.html