//给定一个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>
#include<cmath>
#include<cstdio>
#include<iomanip>
#include<bitset>
using namespace std;
int a[5][5];
int mx[5]={0, 0, 0, 0, 0},mn[5];
int main()
{
int i,j,m=0;
for(i=0;i<5;i++) //这里输入5*5矩阵
{
for(j=0;j<5;j++)
{
scanf("%d",&a[i][j]);
}
}
for(i=0;i<5;i++) //找到5*5矩阵最大值,mx[5]数组存储每行的最大值,mn[5]用来存储每行的最小值。
{
for(j=0;j<5;j++)
{
if(m<a[i][j])
m=a[i][j];
}
}
for(i=0;i<5;i++) //这一步是为了给mn找到一个最大的初值,方便后面比较
{
mn[i]=m+1;
}
for(i=0;i<5;i++) //找到每行的最大值
{
for(j=0;j<5;j++)
{
if(a[i][j]>mx[i]) //重点在于这里的i,j赋值方法,下面找到每列的最小值方法同理
{
mx[i]=a[i][j];
}
}
for(j=0;j<5;j++)
{
if(a[i][j]<mn[j])
{
mn[j]=a[i][j];
}
}
}
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
if(mx[i]==mn[j])
printf("%d %d %d",i+1,j+1,mx[i]);
}
}
// for(int k=0;k<5;k++)
// {
// printf("%d ",mn[k]);
// }
return 0;
}
其他参考代码:
#include <iostream> #include <cstring> #include<math.h> #include<iomanip> int main() { int a[5][5],hmax=-1,lmin=-1,l=-1,h=-1,h0=-1; for(int i=0;i<5;i++) for(int j=0;j<5;j++) scanf("%d",&a[i][j]); for(int i=0;i<5;i++) { hmax=-1,lmin=-1,l=-1,h=i; for(int j=0;j<5;j++) { if(hmax<a[i][j]) {hmax=a[i][j]; l=j; } } for(int i2=0;i2<5;i2++) { if(hmax>a[i2][l]) h=i2; } if(h==i) { h0=i+1; printf("%d %d %d",h+1,l+1,hmax); break; } } if(h0<0) printf("not found"); }