二维¶
二维数组¶
二维数组用结构化的方式表示具有行列属性的数据,在矩阵运算、图形打印、图像处理、表格分析等场景下使用。
二维数组的定义
数组的初始化¶
数组开全局
数组开到全局变量,默认都是 0
使用两层 for 循环初始化
使用memset() 函数初始化
int a[110][110];
int main() {
memset(a, 0, sizeof a); // 初始化成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; i++) {
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] = ' ';
s[i][m] = '\0'; // 使每一行成为合法的 C 风格字符串(要求列容量大于 m)
}
for (int i = 0; i < n; i++) cout << s[i] << endl;
最值问题¶
这和一维数组的操作一样的,求每行的最值、每列的最值,都是使用 "打擂台" 的方式进行。
int a[110][110], n, m;
int row_max[110], col_min[110]; // 维护每行的最大,每列的最小
int main() {
cin >> n >> m;
fill(row_max, row_max + n, numeric_limits<int>::lowest());
fill(col_min, col_min + m, numeric_limits<int>::max());
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) 这个位置是否访问过、是否处理过。
用常量开数组¶
数组能开多大取决于元素类型、存储位置和运行环境的内存限制
数组的多个维度相乘,不能超过10000000,超过这个数,肯定MLE。