二维数组

本文章隶属于 \(zhzzhzzzz\)一个珂学的世界 ,笔者为 \(ahawzlc\)

二维数组

引子

例题 1

给定一个 \(n \times m\) 的矩阵和 \(q\) 个询问,第 \(i\) 个询问形如 \(x_i,y_i\) 表示回答第 \(x_i,y_i\) 个位置上的数据。

利用已有的知识,想必很快就发现了困境。我们只学过一维数组,要想求出一个二维矩阵上的值,必须要开许多个一维数组,而且相当麻烦。

我们学过,一维数组形如 a[b]a是数组名,b是下标范围。那么要是把 [b] 复制一遍,形成形如 \(a[b][c]\) 的形式会怎么样呢?

那么恭喜您,您发现了二维数组。

以此类推我们可以制造出多维数组。

建立与使用

建立、引用和修改

与一维数组相同,如果您没有跳进度,那么二维数组的普通使用与一维数组相同。

要是您跳了进度,麻烦重新看一下在下的这篇文章

为什么说只是普通的使用呢?因为你二爷还是你二爷二维数组还是二维的,就是和一维数组有不同的地方。

不同的地方

循环调用

与一位数组不同的首先是循环调用的问题。

以为数组只需要for(int i=1;i<=n;i++)即可,没有什么讲究。

但是二维数组,我们需要尽量先循环第一维,再循环第二维。这涉及到一些玄学的东西,按维度循环调用可以提高效率。

也就是

for(int i=1;i<=n;i++) 
    for(int j=1;j<=n;j++)
        /*do sth.*/

第二维作第一维的附属

常见于后面要学的动态规划(DP)中,第二维表示不用的状态。读者只需稍有所了解,以后自然懂得。

同时,如果允许,在某些情况(卡常)下甚至可以把二维数组拆成一维数组增加亿点玄学的东西

解决例题 1

标程如下

#include<iostream>
using namespace std;
int a[1005][1005];
int main() {
	int n,m,q;
	cin>>n>>m>>q;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			cin>>a[i][j];
	for(int i=1;i<=q;i++) {
		int x,y;
		cin>>x>>y;
		cout<<a[x][y]<<endl;
	}
	return 0;
}

练习题

例 2 P1830 轰炸III

思路就是模拟,开两个二维数组,一个存储被轰炸过的次数,一个存储最后一次被轰炸的轮数。将轰炸范围之内的点的两个数值更新。

因为笔者懒,所以建议读者先自行思考,如果实在不会,可以参照 luogu 上的题解。

多维数组

一般性问题都差不多,具体的情况需要读者随机应变。

结语

一维数组和二维数组是以后学习更多知识的基础,同时,后续做到的大部分题目,都有数组的参与。所以必须学好!

好的,就写到这里,我们下次再见。

posted @ 2020-08-23 12:02  ahawzlc  阅读(259)  评论(0编辑  收藏  举报