题解
【入门】靶心数
1 条题解
-
0
解题思路
在 n 行 m 列的二维数组里,找出这样的数:它比自己的上、下、左、右四个方向的数都大,这样的数叫靶心数,按输入顺序输出它们。
思路:直接枚举检查。
- 因为靶心数要比上下左右都大,所以它不可能在第一行、最后一行、第一列、最后一列
- 只用检查第 2 行到第 n-1 行、第 2 列到第 m-1 列这些内部格子
- 对每个内部格子,判断它是不是比上、下、左、右四个数都大
- 是的话就输出它,这样自然就是按输入顺序输出了
举例:样例里 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