跳转至

二维数组的应用

下面处理 n 行 m 列,1 <= n, m <= 100,行列下标从 0 开始。

判断边框元素

第一行、最后一行、第一列、最后一列,都是边框。

用字符数组存一个空心图形,边框放 @,里面放空格。

char s[110][110];
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++) {
    for (int j = 0; j < m; j++) cout << s[i][j];
    cout << '\n';
}

一行或一列的表格,每个位置都是边框。

每行、每列的最值

仍然用打擂台。下面的 a 已经读入,n、m 都至少是 1。

每行的最大值

int row_max[110];

for (int i = 0; i < n; i++) {
    row_max[i] = a[i][0];

    for (int j = 1; j < m; j++)
        if (a[i][j] > row_max[i]) row_max[i] = a[i][j];

    cout << row_max[i] << ' ';
}

每列的最小值

int col_min[110];

for (int j = 0; j < m; j++) {
    col_min[j] = a[0][j];

    for (int i = 1; i < n; i++)
        if (a[i][j] < col_min[j]) col_min[j] = a[i][j];

    cout << col_min[j] << ' ';
}

行最值,用这一行的第一个元素初始化;列最值,用这一列的第一个元素初始化。

标记数组

记录 (i, j) 这个位置是否访问过、是否处理过。

bool vis[110][110]; // 开全局,默认都是false
vis[i][j] = true; // 标记第i行、第j列已经访问过