题目描述:
给 定 一 个 5 * 5 的 矩 阵 , 每 行 只 有 一 个 最 大 值 , 每 列 只 有 一 个 最 小 值 , 寻 找 这 个 矩 阵 的 鞍 点。
鞍点指的是矩阵中的一个元素,它是所在行的最大值,并且是所在列的最小值
输 入 要 求:
输 入 包 含 一 个 5 行 5 列 的 矩 阵
输 出 要 求:
如 果 存 在 鞍 点 , 输 出 鞍 点 所 在 的 行 、 列 及 其 值 , 如 果 不 存 在 , 输 出 "not found"。
样例输入:
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
样例输出:
4 1 8
方法1:
分析:遍历每行,每列寻找最大值和最小值,如果是鞍点数f==0,若不是f==1;
1.首先打好格式,因为是矩阵,所以定义一个二维数组。
再定义i(二维数组行变量),j(二维数组列变量),k(检测点变量),f(检测鞍点是否成立),f1(检查有无鞍点)并归0;
#include<iostream>
using namespace std;
int main()
{
int a[6][6];
int i,j,k,f,f1=0;
return 0;
}
2.将数值输入二维数组中
for(i=1;i<=5;i++)
{
for(j=1;j<=5;j++)
{
cin>>a[i][j];
}
}
3.进行行检测,检测每行中的最大值,如果找到最大值,跳出循环;
for(i=1;i<=5;i++)
{
for(j=1;j<=5;j++)
{
f=0;
for(k=1;k<=5;k++)
{
if(a[i][j]<a[i][k])
{
f=1;
break;
}
}
}
}
4.进行列检测,检测每列中的最小值,如果找到最小值,跳出循环;
for(i=1;i<=5;i++)
{
for(j=1;j<=5;j++)
{
f=0;
for(k=1;k<=5;k++)
{
if(a[i][j]>a[k][j])
{
f=1;
break;
}
}
}
}
5.若满足以上最大值和最小值的数,就为鞍点数,输出行,列,鞍点数
for(i=1;i<=5;i++)
{
for(j=1;j<=5;j++)
{
if(f==0)
{
cout<<i<<" "<<j<<" "<<a[i][j];
f1=1;
break;
}
}
if(f==0)
{
break;
}
}
6.若矩阵中没有鞍点数(f1为零),输出“not found"
if(f1==0)
{
cout<<"not found";
}
总体代码实现如下:
#include<iostream>
using namespace std;
int main()
{
int a[6][6];
int i,j,k,f,f1;
for(i=1;i<=5;i++)
{
for(j=1;j<=5;j++)
{
cin>>a[i][j];
}
}
for(i=1;i<=5;i++)
{
for(j=1;j<=5;j++)
{
f=0;
for(k=1;k<=5;k++)//行检测
{
if(a[i][j]<a[i][k])
{
f=1;
break;
}
}
for(k=1;k<=5;k++)//列检测
{
if(a[i][j]>a[k][j])
{
f=1;
break;
}
}
if(f==0)
{
cout<<i<<" "<<j<<" "<<a[i][j];
f1=1;
break;
}
}
if(f==0)
{
break;
}
}
if(f1==0)//若未找到
{
cout<<"not found";
}
return 0;
}
方法2:
分析:与方法1类似,但用替换数值找到最大值及最小值
1.首先打好格式,因为是矩阵,所以定义一个二维数组。
再定义i(二维数组行变量),j(二维数组列变量),k(检测点变量),f(检测鞍点是否成立),f1(检查有无鞍点)并归0,m(最大值比较),mj(标记其行数);
#include<iostream>
using namespace std;
int main()
{
int a[6][6];
int i,j,f,f1=0,m,mj,k;
return 0;
}
2.将数值输入二维数组中
for(i=1;i<=5;i++)
{
for(j=1;j<=5;j++)
{
cin>>a[i][j];
}
}
3.进行列检测,设定其最小值比较每个数并从行号2开始,如有小的替换掉,检测每列中的最小值,如果找到最小值,mj记录第几行,跳出循环;
for(i=1;i<=5;i++)
{
m=-2147483648;
mj=1;
for(j=2;j<=5;j++)
{
if(a[i][j]>m)
{
m=a[i][j];
mj=j;
}
}
}
4.进行行检测,检测mj所在行中的最大值,如果找到最大值,跳出循环;
for(i=1;i<=5;i++)
{
f=0;
for(k=1;k<=5;k++)
{
if(m>a[k][mj])
{
flag=1;
break;
}
}
}
5.若满足以上mj列中的最大值的数,就为鞍点数,输出行,列,鞍点数
for(i=1;i<=5;i++)
{
if(f==0)
{
cout<<i<<" "<<mj<<" "<<m;
f1=1;
break;
}
}
6.若矩阵中没有鞍点数(f1为零),输出“not found"
if(f1==0)
{
cout<<"not found";
}
总体代码实现如下:
#include<iostream>
using namespace std;
int main()
{
int a[6][6],j,i,f,f1=0,m,mj,k;
for(i=1;i<=5;i++)
{
for(j=1;j<=5;j++)
{
cin>>a[i][j];
}
}
for(i=1;i<=5;i++)
{
m=-2147483648;
mj=1;
for(j=2;j<=5;j++)
{
if(a[i][j]>m)
{
m=a[i][j];
mj=j;
}
}
f=0;
for(k=1;k<=5;k++)
{
if(m>a[k][mj])
{
f=1;
break;
}
}
if(f==0)
{
cout<<i<<" "<<mj<<" "<<m;
f1=1;
break;
}
}
if(f1==0)
{
cout<<"not found";
}
return 0;
}
方法3:
分析:用数组来记录最大值及最小值
1.首先打好格式,因为是矩阵,所以定义一个二维数组a(载入矩形),一维数组m(最大值),一维数组mx(最小值
再定义i(二维数组行变量),j(二维数组列变量),k(检测点变量),f(检测鞍点是否成立)
#include<iostream>
using namespace std;
int main()
{
int a[6][6],m[6],mx[6];
int i,j,f;
return 0;
}
2.将矩阵输入,并用两个一维数组记录
#include<iostream>
using namespace std;
int main()
{
int a[6][6],m[6],mx[6],i,j,f=0;
for(i=1;i<=5;i++)
{
for(j=1;j<=5;j++)
{
cin>>a[i][j];
}
}
for(i=1;i<=5;i++)
{
m[i]=a[i][1];
}
for(j=1;j<=5;j++)
{
mx[j]=a[1][j];
}
return 0;
}
3.进行行检测,检测每行中的最大值;
for(i=1;i<=5;i++)
{
for(j=2;j<=5;j++)
{
if(a[i][j]>m[i])
{
m[i]=a[i][j];
}
}
}
4.进行列检测,检测每列中的最小值
for(j=1;k<=5;j++)
{
for(i=2;i<=5;i++)
{
if(a[i][j]<mx[j])
{
mx[j]=a[i][j];
}
}
}
5.比较行中最大值和列中最小值是否相等,若有f=1,输出并退出循环
for(i=1;i<=5;i++)
{
for(j=1;j<=5;j++)
{
if(a[i][j]==m[i]&&a[i][j]==mx[j])
{
cout<<i<<" "<<j<<" "<<a[i][j];
f=1;
break;
}
}
if(f==1)
{
break;
}
}
6.若矩阵中没有鞍点数(f1为零),输出“not found"
if(f==0)
{
cout<<"not found";
}
总体代码实现如下:
#include<iostream>
using namespace std;
int main()
{
int a[6][6],m[6]6,mx[6],i,j,f=0;
for(i=1;i<=5;i++)
{
for(j=1;j<=5;j++)
{
cin>>a[i][j];
}
}
for(i=1;i<=5;i++)
{
m[i]=a[i][1];
}
for(j=1;j<=5;j++)
{
mx[j]=a[1][j];
}
for(i=1;i<=5;i++)
{
for(j=2;j<=5;j++)
{
if(a[i][j]>m[i])
{
m[i]=a[i][j];
}
}
}
for(j=1;k<=5;j++)
{
for(i=2;i<=5;i++)
{
if(a[i][j]<mx[j])
{
mx[j]=a[i][j];
}
}
}
for(i=1;i<=5;i++)
{
for(j=1;j<=5;j++)
{
if(a[i][j]==m[i]&&a[i][j]==mx[j])
{
cout<<i<<" "<<j<<" "<<a[i][j];
f=1;
break;
}
}
if(f==1)
{
break;
}
}
if(f==0)
{
cout<<"not found";
}
return 0;
}
如有不足请指出