974 字
4 分钟阅读
你是否见过我?苏轼寻宝

题目描述

有一次,苏轼在西湖钓鱼时遇到了一位正在钓鱼的老叟,可是他发现老叟的钓鱼竿上并没有钩子,苏轼感到非常奇怪,正当他想问老叟的时候,老叟丢给了他一张图纸,说:“传闻此湖中有一个宝藏,今日见你有缘,就把这藏宝图赠与你罢”,说完扬长而去。
 苏轼打开藏宝图,上面写着“东西最浅,且南北最深处”,意思就是埋藏宝物的点在所在的同一水平线上水深是最浅的,同时在所在的同一竖直线上是最深的,后面是西湖的水深地形图。

你可否帮助苏轼找到此宝藏呢?

输入格式

第一行输入 n,m (1 \le n,m \le 10) ,分别表示西湖的南北方向长度和东西方向长度。
接下来 n 行每行输入 m 个数据,表示各坐标的湖水水深。
保证每组数据有且只有一个这样的点,且每处水深不同。

输出格式

输出宝藏坐标。

输入样例 1

3 3
1 2 3
4 5 6
7 8 9

输出样例 1

(3,1)

输入样例 2

3 3
1 2 3
7 8 9
5 4 6

输出样例 2

(2,1)

题意

找出二维数组中唯一满足作为当前行最小值同时作为当前列最大值的位置。

思路

显然我们可以先遍历一遍,将每行的最小值打上标记。

再遍历一遍二维数组,将每列的最大值找出来,如果有之前行最小值标记,输出当前位置。

注意:行、列下标从 1 开始。

代码

void solve(){
    int n,m;
    cin >> n >> m;
    int graph[n + 1][m + 1];
    for(int i = 1;i <= n;i++){
        for(int j = 1;j <= m;j++){
            cin >> graph[i][j];
        }
    }
    int ch[n + 1][m + 1] = {0};
    for(int i = 1;i <= n;i++){ // 外层循环行下标 找出行最小值
        int mn = 1e9;
        int y = -1;
        for(int j = 1;j <= m;j++){
            if(graph[i][j] < mn){
                mn = graph[i][j];
                y = j;
            }
        }
        ch[i][y] = 1;
    }
    for(int j = 1;j <= m;j++){ // 外层循环列下标 找出列最大值
        int mx = -1;
        int x = -1;
        for(int i = 1;i <= n;i++){
            if(graph[i][j] > mx){
                mx = graph[i][j];
                x = i;
            }
        }
        if(ch[x][j]){
            printf("(%d,%d)",x,j);
        }
    }
}

1 条评论

  1. 2026年贵工程寒假训练题解 – 追求的个人博客 2026年1月4日

    […] 你是否见过我?苏轼寻宝 题解 […]

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注