![28a4667a77524f65e754eb01392f6195.png](https://i-blog.csdnimg.cn/blog_migrate/08e1ea5bd80988359f9254bdea09dbdb.png)
![5db560303e8cba258e355396a66e6bf2.png](https://i-blog.csdnimg.cn/blog_migrate/7540ad2ca17c5acd22cecd6e4fe72429.png)
【题目描述】
给定一个5×5的矩阵,每行只有一个最大值,每列只有一个最小值,寻找这个矩阵的鞍点。鞍点指的是矩阵中的一个元素,它是所在行的最大值,并且是所在列的最小值。
例如:在下面的例子中(第4行第1列的元素就是鞍点,值为8 )。
【输入】
输入包含一个5行5列的矩阵。
【输出】
如果存在鞍点,输出鞍点所在的行、列及其值,如果不存在,输出"not found"。
【输入样例】
11 3 5 6 9
12 4 7 8 10
10 5 6 9 11
8 6 4 7 2
15 10 11 20 25
【输出样例】
4 1 8
说明
主要考查二维数组,以及关于《鞍点》的知识。
题目概述
遍历一个5×5的矩阵,找鞍点,根据鞍点是否存在输出相应的结果。
本题的有一个鲜为人知的知识点——鞍点。一个5×5的矩阵,可能存在一个鞍点还是多个呢?
鞍点的概念
鞍点的鞍,其意是马鞍。马鞍是人们在马的背部安装一个座椅。其形状如下图:
上图是一个真实的马鞍。将马鞍的长度作为横向,高度作为纵向,可以得到下图。
上图的表情就是该马鞍的鞍点,该位置在横向上最低,在纵向上最高。
也说明:一个矩阵中,每一行和每一列的数字不能相等。
思路分析
对于5×5的矩阵,它的行号和列号都是从1开始,所以数组元素的下标从1开始使用比较方便。
声明一个最大值nMax和一个最小值nMin变量,用于存储矩阵中的坐标。其中nMax用于存储当前行最大值的列号,nMin用于存储当前列最小值的行号。
接着使用循环嵌套输入矩阵数据。
代码如下:
开始找鞍点。使用循环嵌套遍历每行每列,找出一行中最大值的列号(下标)存储在nMax中。此时a[i][nMax]便是第i行的最大值。
代码如下:
代码中,nMax赋值为1,表示假设第i行1列(a[i][1])的值最大,所以循环中,变量j的取值是2~5。注意变量nMax存储的不是最大值,而是最大值的列号。
上面找出第i行最大值的列号nMax,接着遍历nMax列,找出该列中的最小值,并把最小值的行号存储在nMin中。
代码如下:
代码中,nMin赋值为1,表示假设第1行nMax列(a[1][nMax])的值最小,所以循环中,变量k的取值是2~5。注意变量nMin存储的不是最小值,而是最小值的行号。
因为是在第nMax列中找最小值,所以数组元素的列号都是nMax。
此时,已找出第i行中的最大值a[i][nMax],也找出第nMax列的最小值a[nMin][nMax],如果i等于nMin,说明最大值与最小值是同一坐标,表示找到鞍点。根据要求输出即可。
同时,注意题中指出:如果不存在鞍点,则输出"not found"。不能在循环嵌套中输出,因为循环嵌套主要用于寻找鞍点,会循环多次,不可能循环一次找不到鞍点就输出一次"not found",只有遍历结束后,确定找不到鞍点才能输出。而判断是否找到鞍点,可以声明一个标记变量来辅助。
代码如下:
最后就是对标记变量flag的判断,如果flag还是一开始初始化的值,表示找不到鞍点,则输出字符串"not found"。
代码如下:
数据类型:数据类型较为简单,注意数组的长度即可。
参考代码 - C++
参考代码下载链接
https://pan.baidu.com/s/1gMemHC2OvE3i03DgmAHGnQ
提取码: dsbc
END
注:题目来源于网络,转载于《信息学奥赛一本通(C++版)在线评测系统》,点击下方的【阅读原文】即可打开该题的链接。
题解属于本微信公众号【大神编程】原创。