Coursera 学习记录:寻找山顶(找出二维数组中“上下左右间的最大值”)

版权声明:知识内容为原创思考,转载请注明:转自 https://blog.csdn.net/SmartLoveyu/article/details/84931329

描述

在一个m×n的山地上,已知每个地块的平均高程,请求出所有山顶所在的地块
(所谓山顶,就是其地块平均高程不比其上下左右相邻的四个地块每个地块的平均高程小的地方)。

输入

第一行是两个整数,表示山地的长m(5≤m≤20)和宽n(5≤n≤20)。
其后m行为一个m×n的整数矩阵,表示每个地块的平均高程。每行的整数间用一个空格分隔。

输出

输出所有上顶所在地块的位置。每行一个。按先m值从小到大,再n值从小到大的顺序输出。

样例输入
10 5
0 76 81 34 66
1 13 58 4 40
5 24 17 6 65
13 13 76 3 20
8 36 12 60 37
42 53 87 10 65
42 25 47 41 33
71 69 94 24 12
92 11 71 3 82
91 90 20 95 44

样例输出
0 2
0 4
2 1
2 4
3 0
3 2
4 3
5 2
5 4
7 2
8 0
8 4
9 3

理解题目

题目的模型是10*5的二维数组,也就是有50块地上,每一块地方都有相应的高度。
所以,这里的意思就是,先找数组中相对于起上下左右最高的点,然后输出其m,n的值即可。

#include<iostream>
using namespace std;

int main()
{
    int hill[20][20];//存储所有的值
    //int peak[20][20];
    int m, n;//分别为长和宽
    cin >> m >> n;
    /*
    先将数组的值填充好,然后再找相对应的最大值。
    */
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            cin >> hill[i][j];
        }
    }
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            //int temp = 0;
            //temp = hill[i][j];
            //if (temp >= hill[i-1][j] && temp >= hill[i+1][j] 
            //    && temp >= hill[i][j+1] && temp >= hill[i][j-1] ) {
            //    cout << i << ' ' << j <<endl;
            /*
            少了一点,确定边界,而进行的分类讨论,虽然结果是一样的。
            两种情况,一种是有上下左右存在且可以比较,一种是上下左右不存在,这个也要单独列出
            */
            if (((hill[i][j] >= hill[i - 1][j] && i - 1 >= 0) || (i - 1 < 0)) &&
                ((hill[i][j] >= hill[i + 1][j] && i + 1 <= m - 1) || (i + 1 > m - 1)) &&
                ((hill[i][j] >= hill[i][j + 1] && j + 1 <= n - 1) || (j + 1 > n - 1)) &&
                ((hill[i][j] >= hill[i][j - 1] && j - 1 >= 0) || (j - 1 < 0))) { //括号很多,一定要小心谨慎,我在括号上不小心栽了跟头。
                cout << i << ' ' << j << endl;
            }

        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/SmartLoveyu/article/details/84931329
今日推荐