给定一个m*n的矩阵,寻找这个矩阵的鞍点。鞍点指的是矩阵中的一个元素,它是所在行的最大值,并且是所在列的最小值。例如:在下面的例子中(第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
如果存在鞍点,输出鞍点所在的行、列及其值,如果存在多个,先输出行数更小的,行数相同,先输出列数最小的,如果不存在,输出"No"。
思路:先比行,再比列,符合要求就+1,利用flag数组输出最终结果。
#include<stdio.h>
#include<iostream>
using namespace std;
int main()
{
int arr[200][200] = { 0 };
int m, n;
cin >> m >> n;
for (int i = 1; i <= m; i++)
{
for (int j = 1; j <= n; j++)
{
cin >> arr[i][j];
}
}
int flag[200][200] = { 0 };
int max, min;
for (int i = 1; i <= m; i++)
{
for (int j = 1; j <= n; j++)
{
if (j == 1)
max = arr[i][j];
else if (arr[i][j] >= max)
max = arr[i][j];
}
for (int j = 1; j <= m; j++)
{
if (arr[i][j] == max)
flag[i][j]++;
for (int k = 1; k <= m; k++)
{
if (flag[i][j] == 1)
flag[i][0]++;
}
if (flag[i][0] > 1)
{
for (int k = 1; k <= m; k++)
{
flag[i][k] = 0;
}
}
}
}
for (int j = 1; j <= n; j++)
{
for (int i = 1; i <= m; i++)
{
if (i == 1)
min = arr[i][j];
else if (arr[i][j] <= min)
min = arr[i][j];
}
for (int i = 1; i <= n; i++)
{
if (arr[i][j] == min)
flag[i][j]++;
}
}
int flag1 = 1;
for (int i = 1; i <= m; i++)
{
for (int j = 1; j <= n; j++)
{
if (flag[i][j] == 2)
{
printf("%d %d %d\n", i, j, arr[i][j]);
flag1 = 0;
}
}
}
if (flag1 == 0)
{
printf("No\n");
}
return 0;
}