top1编程
← 返回题目
题解

【入门】靶心数

1 条题解

  • 0
    @ 2026-7-31 20:35:11

    解题思路

    在 n 行 m 列的二维数组里,找出这样的数:它比自己的上、下、左、右四个方向的数都大,这样的数叫靶心数,按输入顺序输出它们。

    思路:直接枚举检查。

    1. 因为靶心数要比上下左右都大,所以它不可能在第一行、最后一行、第一列、最后一列
    2. 只用检查第 2 行到第 n-1 行、第 2 列到第 m-1 列这些内部格子
    3. 对每个内部格子,判断它是不是比上、下、左、右四个数都大
    4. 是的话就输出它,这样自然就是按输入顺序输出了

    举例:样例里 4 行 4 列,内部格子有 (2,2)(2,3)(3,2)(3,3) 四个:

    • (2,2) 的数是 6,它比上 5、下 1、左 5、右 5 都大,是靶心数
    • (2,3) 的数是 5,上面是 2、下面是 11,11 比它大,所以不是
    • (3,2) 的数是 1,谁都比它大,不是
    • (3,3) 的数是 11,比上 5、下 5、左 1、右 10 都大,是靶心数 所以输出 6 和 11。

    参考代码

    #include <iostream>
    using namespace std;
    
    int a[105][105];  // 存放二维数组
    
    int main() {
        int n, m;
        cin >> n >> m;
        // 读入 n 行 m 列的二维数组
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                cin >> a[i][j];
            }
        }
    
        // 靶心数要能比上下左右都大,所以不可能在边界上
        // 只需要检查第 2 行到第 n-1 行、第 2 列到第 m-1 列
        for (int i = 2; i <= n - 1; i++) {
            for (int j = 2; j <= m - 1; j++) {
                // 上下左右四个方向的数都比它小,才是靶心数
                if (a[i][j] > a[i - 1][j] && a[i][j] > a[i + 1][j]
                    && a[i][j] > a[i][j - 1] && a[i][j] > a[i][j + 1]) {
                    cout << a[i][j] << endl;  // 按输入顺序输出
                }
            }
        }
        return 0;
    }
    

    复杂度分析

    • 时间复杂度:O(n×m),每个格子最多检查一次
    • 空间复杂度:O(n×m),存整个二维数组
    • 1