版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
OJ地址:https://vjudge.net/problem/OpenJ_Bailian-3670
给定一个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
Input
输入包含一个5行5列的矩阵
Output
如果存在鞍点,输出鞍点所在的行、列及其值,如果不存在,输出"not found"
Sample Input
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
Sample Output
4 1 8
程序代码:
先求出每一行最大值和每一列的最小值
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main(){
int a[5][5];
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
scanf("%d",&a[i][j]);
}
}
int c[5];
memset(c,9999,sizeof(c));
//找出每列的最小值
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
if(a[j][i]<c[i]){
c[i]=a[j][i];
}
}
}
int b[5];
memset(b,-9999,sizeof(b));
//找出每行的最大值
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
if(a[i][j]>b[i]){
b[i]=a[i][j];
}
}
}
for(int i=0;i<5;i++) {
printf("%d %d\n",b[i],c[i]);
}
return 0;
}
运行结果:
完善:
在后面进行时,我决定使用结构体去分别存储最值以及最值对应的位置(x,y),这样更加方便。
程序代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct LCC{
int m; //查找的最值
int x; //该数行的位置
int y; //该数行的位置
}c[5],b[5];
int main(){
int a[5][5];
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
scanf("%d",&a[i][j]);
}
}
memset(c,9999,sizeof(c));
//找出每列的最小值
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
if(a[j][i]<c[i].m){
c[i].m=a[j][i];
c[i].x=i+1;
c[i].y=j+1;
}
}
}
memset(b,-9999,sizeof(b));
//找出每行的最大值
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
if(a[i][j]>b[i].m){
b[i].m=a[i][j];
b[i].y = j+1;
b[i].x = i+1;
}
}
}
// for(int i=0;i<5;i++) {
// printf("%d %d %d\n",b[i].m,b[i].x,b[i].y);
// }
// printf("\n");
// for(int i=0;i<5;i++) {
// printf("%d %d %d\n",c[i].m,c[i].x,c[i].y);
//
// }
int flag=0;
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
if(b[i].x==c[j].y&&b[i].y==c[j].x){
printf("%d %d %d\n",b[i].x,b[i].y,b[i].m);
flag = 1;
break;
}
}
}
if(flag==0){
printf("not found\n");
}
return 0;
}