跳转至

二维数组

二维数组

二维数组用结构化的方式表示具有行列属性的数据,在矩阵运算、图形打印、图像处理、表格分析等场景下使用。

二维数组的定义

数据类型 数组名称[数组行数][数组列数]

例如
int a[110][110]; // 开了一个名字叫做小a的二维数组,大小是110*110

数组的初始化

数组开到全局变量,默认都是 0

int a[110][110];

int main() {
    ...
}

两层 for 循环初始化

for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++) a[i][j] = 0;

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
    ...
}

一个大括号初始化(不常用)

int a[4][5] = {1, 2, 3, 4, 5, 6, 7, 8};

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

多个大括号初始化(不常用)

int a[4][5] = {{1}, {2, 3}, {4, 5, 6}, {7, 8}};

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

数组的输入输出

两层 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;
    }
}

数组的访问

下标访问

数组名[][]

例如
a[0][0]访问第0行第0列
a[i][j]访问第i行第j列

数组的遍历

逐行遍历

for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) cout << a[i][j] << ' ';
    cout << endl;
}

逐列遍历

for (int j = 0; j < m; j++) {
    for (int i = 0; i < n; i++) 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) 这个位置是否访问过、是否处理过。

bool vis[110][110];

用常量开数组

const int N = 1e3 + 10;
int a[N][N];

这里需要注意,一维数组最大开到 1e7 ,对于二维数组,两个维度相乘不能超过 1e7