一本通网站1122题:计算鞍点
【题目描述】
给定一个5×5的矩阵,每行只有一个最大值,每列只有一个最小值,寻找这个矩阵的鞍点。鞍点指的是矩阵中的一个元素,它是所在行的最大值,并且是所在列的最小值。
例如:在下面的例子中(第4行第1列的元素就是鞍点,值为8 )。
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
【输入】
输入包含一个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
#include<iostream>
using namespace std;
#include<string>
int main()
{ios::sync_with_stdio(false);cin.tie(nullptr); cout.tie(nullptr);//创建二维数组并输入数据int** arr = new int* [5];bool flag;for (int i = 0; i < 5; i++){arr[i] = new int[5];}for (int i = 0; i < 5; i++){for (int j = 0; j < 5; j++){cin >> arr[i][j];}}for (int i = 0; i < 5; i++){int max_num = arr[i][0];int k = 0;//遍历行,找出最大值及其列号for (int j = 0; j < 5; j++){if (arr[i][j] > max_num) {max_num = arr[i][j];k = j;}}flag = true;//遍历列,判断该最大值是否为该列最小值for (int j = 0; j < 5; j++){if (j == i) {continue;}if (arr[j][k] < arr[i][k]) {flag = false;}}//如果是则输出该鞍点的位置及值并结束程序if (flag){cout << i + 1 << " " << k + 1 << " " << arr[i][k];break;}}//如果没有鞍点则输出“not found”if (!flag) {cout << "not found" << endl;}
}
题目大概的思路就是遍历每一行,找到这一行的最大值,然后记录所在的列,然后固定列,再去判断是不是这一列的最小值,然后用一个flag进行标记,最后也可以通过flag判断是否找到,如果没找到就输出not found。
我犯了两个错误:
- 在找最大值的时候,只顾着更新k,没有更新max_num,那么这个值就不一定是这一行的最大值
- 忘了判断在没有找到的时候打印not found。有时候还是需要多读几遍题目。不要漏掉了条件。
