top1编程
← 返回题目
题解

最大数的位置

1 条题解

  • 0
    @ 2026-8-5 1:22:40

    解题思路

    题目给出一个 n 行 m 列的二维数组,再给一个位置 (x, y),要找出 a[x][y] 和它四周的元素(上、下、左、右共 4 个)里最大的那个,并输出它所在的行和列。

    做法:

    1. 先把整个二维数组读进数组 a;
    2. 设 mx 记录最大值,一开始就认为是 a[x][y] 自己,位置记 (rx, ry) = (x, y)。这样做的好处是:如果好几个数并列最大,会优先输出 a[x][y] 自己的位置;
    3. 依次比较上、下、左、右四个邻居:越界的格子要跳过;只要遇到比 mx 更大的数,就更新 mx 和它的位置;
    4. 输出位置 (rx, ry)。

    方向可以预先放在两个数组里:

    • dx 表示“行”方向的变化:上走一格是 -1,下走一格是 +1,左右不变是 0;
    • dy 表示“列”方向的变化:左走一格是 -1,右走一格是 +1,上下不变是 0。

    用循环遍历 4 个方向,代码更整齐、不容易漏写。

    参考代码

    // P4434 最大数的位置:在二维数组中找 a[x][y] 及其四周(上下左右)元素中的最大值,输出其行列下标
    #include <iostream>
    using namespace std;
    
    int a[105][105]; // 二维数组,最多 100 行 100 列
    
    int main() {
        int n, m; // n 行 m 列
        cin >> n >> m;
        for (int i = 0; i < n; i++)
            for (int j = 0; j < m; j++)
                cin >> a[i][j];
    
        int x, y; // 给定的数组元素下标
        cin >> x >> y;
    
        // 先假设 a[x][y] 本身是最大的,这样并列时优先输出它自己的位置
        int mx = a[x][y], rx = x, ry = y;
    
        // 依次比较上方、下方、左边的数(越界的跳过),只有严格大于才更新
        // 这样遇到并列的最大值时,会保留先比较到的那个位置
        int dx[4] = {-1, 1, 0, 0}; // 四个方向:上、下、左、右
        int dy[4] = {0, 0, -1, 1};
        for (int k = 0; k < 4; k++) {
            int i = x + dx[k], j = y + dy[k]; // 邻居的坐标
            if (i < 0 || i >= n || j < 0 || j >= m) continue; // 越界跳过
            if (a[i][j] > mx) { // 找到更大的数就更新位置
                mx = a[i][j];
                rx = i;
                ry = j;
            }
        }
    
        cout << rx << " " << ry << endl; // 输出最大值所在的行列下标
        return 0;
    }
    

    复杂度分析

    • 读入二维数组需要遍历所有格子,时间复杂度是 O(n × m);找最大元素只看了 a[x][y] 自己和上下左右最多 5 个格子,这部分是常数时间。
    • 需要存整个二维数组,空间复杂度是 O(n × m)。
    • 1