二维数组
本文章隶属于 \(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 上的题解。
多维数组
一般性问题都差不多,具体的情况需要读者随机应变。
结语
一维数组和二维数组是以后学习更多知识的基础,同时,后续做到的大部分题目,都有数组的参与。所以必须学好!
好的,就写到这里,我们下次再见。