二维数组¶
二维数组¶
二维数组用结构化的方式表示具有行列属性的数据,在矩阵运算、图形打印、图像处理、表格分析等场景下使用。
二维数组的定义
数组的初始化¶
数组开到全局变量,默认都是 0
两层 for 循环初始化
memset()
函数初始化
int a[110][110];
int main() {
memset(a, 0, sizeof 0); // 初始化成0
memset(a, 0x3f, sizeof a); // 初始化成极大值,都是0x3f3f3f3f
memset(a, -1, sizeof a); // 初始化成-1
...
}
一个大括号初始化(不常用)
多个大括号初始化(不常用)
数组的输入输出¶
两层 for 循环输入输出。输出时,注意行末添加换行操作。
int a[110][110], n, m;
int main() {
cin >> n >> m;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++) cin >> a[i][j];
for (int i = 0; i < n; j++) {
for (int j = 0; j < m; j++) cout << a[i][j] << ' ';
cout << endl;
}
}
数组的访问¶
下标访问
数组的遍历¶
逐行遍历
逐列遍历
判断边框元素
如果是边框,存储符号,否则存储空格,存储一个空心的图形。
输出时,按多行字符串进行输出
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++)
if (i == 0 || i == n - 1 || j == 0 || j == m - 1) s[i][j] = '@';
else s[i][j] = ' ';
}
for (int i = 0; i < n; i++) cout << s[i] << endl;
最值问题¶
这和一维数组的操作一样的,求每行的最值,每列的最值,都是使用“打擂台”的方式进行。
int a[110][110], row_max[110], col_min[110], n, m;
int main() {
cin >> n >> m;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++) {
cin >> a[i][j];
row_max[i] = max(row_max[i], a[i][j]);
col_min[j] = min(col_min[j], a[i][j]);
}
}
标记数组¶
标记数组,用于维护(i, j)
这个位置是否访问过、是否处理过。
用常量开数组¶
这里需要注意,一维数组最大开到 1e7
,对于二维数组,两个维度相乘不能超过 1e7
。