OpenJ_Bailian - 3670 计算鞍点

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_42410605/article/details/102724209

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;
}

运行结果:

猜你喜欢

转载自blog.csdn.net/qq_42410605/article/details/102724209