【题目描述】
给定一个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
方法一
思路:
设每一行第1列为最大值max,变量L设为0,变量X设为0,标记是否找到。遍历后面的2到5行,找到该行最大值后,变量L修改为对应的列下标j。接下来遍历该列的每行,找到最小值min,判断max和min是否相等,相等输出对应的i和L,X更新为1。最后判断X是否为0,为0则输出not found
核心代码:
int x=0;
for(int i=0;i<5;i++)
{
int max=a[i][1];
L=1;
for(int j=1;j<5;j++)
{
if(a[i][j]>max)
{
max=a[i][j];
L=j;
}
}
int min=9999;
for(int k=0;k<5;k++)
{
if(min>a[k][L])
{
min=a[k][L];
}
}
if(min==max)
{
x=1;
cout<<i<<" "<<L<<" "<<a[i][L];
}
if(x==1)
{
cout<<"not found";
}
方法二
思路:
建立两个一位数组b[5],c[5],b数组存储每行的最大值,c数组存储每列的最小值,最后同时变量b,c数组,找是否存在相同的数,有就输出对应的下标和数值,没找到就输出“no found”.
核心代码:
int b[5],c[5];
for(int i=0;i<5;i++)
{
int max=a[i][0];
for(int j=1;j<5;j++)
{
if(max>a[i][j])
{
max=a[i][j];
}
}
max=b[i];
}
for(int i=0;i<5;i++)
{
int min=a[0][i];
for(int j=1;j<5;j++)
{
if(min>a[j][i])
{
min=a[j][i];
}
}
min=c[i];
}
for(int i=0;i<5;i++)
{
for(int j=0;j<5;j++)
{
if(b[i]==c[j])
{
cout<<i<<" "<<j<<" "<<b[i];
return 0;
}
}
cout<<"no found";
}