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