【c++ 计算鞍点】题解与感想!

我的同桌再一次帮助了我!本来这次看到我的程序比他的短好多,有种说不出的小开心嘿嘿( • ̀ω•́ )✧!结果我的程序还是光荣错掉了。。。

还是让他帮我改了程序QWQ....................

问题 E: 计算鞍点

时间限制: 1 Sec  内存限制: 128 MB

题目描述

给定一个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 21
5 10 11 20 25

样例输出

4 1 8

定义与初始化:(今天的我也在好好打头文件)


ss用来输入矩阵,输入过程省略~

接下来是把情况存进ss2,可能有点绕,仔细看。。。相信大家可以看懂

当时听我同桌讲解时我花了好久才弄懂。。。(˘•ω•˘)

扫描二维码关注公众号,回复: 1985937 查看本文章


现在我们调试一下,把样例输进去,显示每一位的情况:

可以发现样例输出的“8”的位置就是调试结果中“2”的位置

感谢你看到这里

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
	int maxn=-1,minn=99999,ss[6][6],ss2[6][6],jl/*记录*/;
	int i,j;
	memset(ss,0,sizeof(ss));
	memset(ss2,0,sizeof(ss2));
	for(i=1; i<=5; i++) 	for(j=1; j<=5; j++) 	cin>>ss[i][j];//循环输入
	for(i=1; i<=5; i++)//行循环
	{
		jl=1;//在列循环前给记录归1
		for(j=1; j<=5; j++)//进入列循环
		{
			if(ss[i][j]>maxn)
			{
				maxn=ss[i][j];
				jl=j;/*记录当前最大值出现在i行的第几列*/
			}
		}
		++ss2[i][jl];//找到第i行的最大值在该行的第j列后,在ss2数组中给它的位置++,进入寻找下一行的最大值的循环
	}
	for(j=1; j<=5; j++)//列循环
	{
		jl=1;//在行循环前给记录归1
		for(i=1; i<=5; i++)//进入列循环
		{
			if(ss[i][j]<minn)
			{
				minn=ss[i][j];
				jl=i;/*记录当前最小值出现在j列的第几行*/
			}
		}
		++ss2[jl][j];//找到第j列的最小值在该行的第i行后,在ss2数组中给它的位置++,进入寻找下一列的最小值的循环
		if(ss2[jl][j]==2)
		{
			cout<<jl<<' '<<j<<' '<<ss[jl][j]<<endl;
			return 0;
		}
	}
	cout<<"not found"<<endl;
	return 0;
}


猜你喜欢

转载自blog.csdn.net/JaneSilver/article/details/80951594