7-21 找鞍点 (20分)

一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。

本题要求编写程序,求一个给定的n阶方阵的鞍点。

输入格式:
输入第一行给出一个正整数n(1≤n≤6)。随后n行,每行给出n个整数,其间以空格分隔。

输出格式:
输出在一行中按照“行下标 列下标”(下标从0开始)的格式输出鞍点的位置。如果鞍点不存在,则输出“NONE”。题目保证给出的矩阵至多存在一个鞍点。

输入样例1:

4
1 7 4 1
4 8 3 6
1 6 1 2
0 7 8 9

输出样例1:

2 1

输入样例2:

2
1 7
4 1

输出样例2:

NONE

知识点

切记!!!
【部分答案错误】:如果一行中有两个最大值,或者一列中有两个最小值
【改进】:>=max 和 <=min ,加等号!

参考代码一(结构体)

找到每行最大的,把每行的r都设为1
找到每列最小的,把每列的c都设为1
遍历整个数组, if(arr[i][j].r == 1&&arr[i][j].c == 1) 输出
cnt==0记为NONE

#include<iostream>
using namespace std;
const int N=100;

int n,cnt=0;

struct node{
	int value;
	int r,c; //行数 列数 
}arr[N][N]; 

int main(){
	cin>>n;
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			cin>>arr[i][j].value;
		}
	}
	for(int i=0;i<n;i++){
		//找到每行最大的,把每行的r都设为1 
		int maxx=-999999999;
		for(int j=0;j<n;j++){
			if(arr[i][j].value>=maxx){
				maxx=arr[i][j].value;  //找行最大的 
			}
		}
		for(int j=0;j<n;j++){
			if(arr[i][j].value==maxx){
				arr[i][j].r=1;  //把最大的行设为1 
			}
		}
	}
	for(int i=0;i<n;i++){
		//找到每列最小的,把每列的c都设为1 
		int minx=999999999;
		for(int j=0;j<n;j++){
			if(arr[j][i].value<=minx){  //注意此时此刻是 j i 
				minx=arr[j][i].value;
			}
		}
		for(int j=0;j<n;j++){
			if(arr[j][i].value==minx){
				arr[j][i].c=1;  //把最大的列设为1 
			}
		}
	} 
	//遍历整个数组 
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			if(arr[i][j].r==1&&arr[i][j].c==1){
				cout<<i<<' '<<j;
				cnt++;
				return 0;
			}
		}
	}
	if(cnt==0){
		cout<<"NONE";
	}
	return 0;
} 

参考代码二

先逐行搜索最大的元素 记下行下标 再逐列搜索最小的元素 判断这两个元素元素行下标是否相同

#include<iostream>
using namespace std;

int main(){
	int n,cnt=0;  
	cin>>n;
		
	int arr[6][6];
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			cin>>arr[i][j];
		}
	}
	int i;
	for(i=0;i<n;i++){  //行
		int max=arr[i][0],flagy=0;  //初始化,假设行里的第一个为max 
		for(int j=0;j<n;j++){   //00 01 02 03 //10 11 12 13
			if(arr[i][j]>=max){  
				max=arr[i][j];       //行里面的最大数 
				flagy=j;            //确定最大的所在列是 j 
			}
		}
		int min=arr[0][flagy],flagx=0;
		for(int k=0;k<n;k++){
			if(arr[k][flagy]<=min){
				min=arr[k][flagy];
				flagx=k;
			}
		} 
		if(flagx==i){
			cout<<flagx<<' '<<flagy<<endl; 
			cnt++; 
			break;
		} 
	}
	if(cnt==0){
		cout<<"NONE"<<endl; 
	}	
} 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DDouble-

你的鼓励是我最大的动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值