题目描述
给定一个 5×5 的矩阵,每行只有一个最大值,每列只有一个最小值,寻找这个矩阵的鞍点。鞍点指的是矩阵中的一个元素,它是所在行的最大值,并且是所在列的最小值。
例如:在下面的例子中,第4行第1列的元素就是鞍点,值为 88。
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
。
输入输出样例
输入 #1
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
输出 #1
4 1 8
———————————————————————————————————————————
原文链接:B2102 计算鞍点 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
第一种
代码及思路:
1.定义变量
int a[6][6];
int i,j,flag,k,flag1=0;
2.输入数组
for(i=1;i<=5;i++)
{
for(j=1;j<=5;j++)
{
cin>>a[i][j];
}
}
3.行检测和列检测且输出
for(i=1;i<=5;j++)
{
for(j=1;j<=5;j++)
{
flag=0;//标记变量定义为0
for(k=1;k<=5;k++)//行检测
{
if(a[i][j]>a[i][k])//如果i行j列大于i行k列
{
flag=1;//标记变量刷新为1
break;//跳出循环
}
}
for(k=1;k<=5;k++)//列检测
{
if(a[i][j]>a[k][j])//如果i行j列大于k行j列
{
flag=1;//标记变量刷新为1
break;//跳出循环
}
}
if(flag==0)//如果标记变量为0
{
cout<<i<<" "<<j<<a[i][j];输出行和列
flag1=1;//第二个标记变量为1
break;//跳出循环
}
}
if(flag==0)//如果标记变量为0
{
break;//跳出循环
}
}
4.输出
if(flag1==0)//如果第二个标记变量为0
{
cout<<"no found";//输出“no found”
}
总代码(1)
#include<iostream>
using namespace std
int main()
{
int a[6][6];
int i,j,flag,k,flag1=0;
for(i=1;i<=5;i++)
{
for(j=1;j<=5;j++)
{
cin>>a[i][j];
}
}
for(i=1;i<=5;j++)
{
for(j=1;j<=5;j++)
{
flag=0;
for(k=1;k<=5;k++)//行检测
{
if(a[i][j]>a[i][k])
{
flag=1;
break;
}
}
for(k=1;k<=5;k++)//列检测
{
if(a[i][j]>a[k][j])
{
flag=1;
break;
}
}
if(flag==0)
{
cout<<i<<" "<<j<<a[i][j];
flag1=1;
break;
}
}
if(flag==0)
{
break;
}
}
if(flag1==0)
{
cout<<"no found";
}
return 0;
}
第二种
代码及思路:
1.定义变量
int a[6][6];//定义二维数组
int i,j,flag,flag1,max,maxj,k;//定义基本变量
flag1=0;//第二个标记变量初值附为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++)
{
max=a[i][1];//将最大值的值附为a[i][1]
maxj=1;//将最大值下标附为1
for(j=2;j<=5;j++)//从2开始寻找最大值
{
if(a[i][j]>max)//如果有元素>max
{
max=a[i][j];//max将大于它的值附过来
maxj=j;//最大值坐标更新为j
}
}
flag=0;//flag刷新为0
for(k=1;k<=5;k++)
{
if(max>a[k][maxj])//如果最大值大于a[k][maxj]
{
flag=1;//标记变量刷新为1
break;//跳出循环
}
}
if(flag==0)//如果标记变量为0
{
cout<<i<<" "<<maxj<<" "<<max;//输出最大值的行、最大值的列、最大值
flag1=1;//第二个标记变量刷新为1
break;//跳出循环
}
}
4.输出
if(flag1==0)//如果第二个标记变量为0
{
cout<<"not found";//输出"not found"
}
总代码(2)
#include<iostream>
using namespace std
int main()
{
int a[6][6];
int i,j,flag,flag1,max,maxj,k;
flag1=0;
for(i=1;i<=5;i++)//行
{
for(j=1;j<=5;j++)//列
{
cin>>a[i][j];//输入数组行和列
}
}
for(i=1;i<=5;i++)
{
max=a[i][1];//将最大值的值附为a[i][1]
maxj=1;//将最大值下标附为1
for(j=2;j<=5;j++)//从2开始寻找最大值
{
if(a[i][j]>max)//如果有元素>max
{
max=a[i][j];//max将大于它的值附过来
maxj=j;//最大值坐标更新为j
}
}
flag=0;//flag刷新为0
for(k=1;k<=5;k++)
{
if(max>a[k][maxj])//如果最大值大于a[k][maxj]
{
flag=1;//标记变量刷新为1
break;//跳出循环
}
}
if(flag==0)//如果标记变量为0
{
cout<<i<<" "<<maxj<<" "<<max;//输出最大值的行、最大值的列、最大值
flag1=1;//第二个标记变量刷新为1
break;//跳出循环
}
}
if(flag1==0)//如果第二个标记变量为0
{
cout<<"not found";//输出"not found"
}
return 0;
}
第三种
代码及思路:
1.定义变量
int a[6][6],Max[6],Min[6];//定义三个数组
int i,j,flag=0;//基本变量(标记变量初值赋为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++)//行
{
Max[i]=a[i][1];//最大值赋初值
}
4.最小值赋值
for(j=1;j<=5;j++)//列
{
Min[j]=a[1][j];//最小值赋初值
}
5.寻找最大值
for(i=1;i<=5;i++)//行
{
for(j=2;j<=5;j++)//列
{
if(a[i][j]>Max[i])//比较大小
{
Max[i]=a[i][j];//更新最大值的值
}
}
}
6.寻找最小值
for(j=1;j<=5;j++)//列
{
for(i=2;i<=5;i++)//行
{
if(a[i][j]<Min[j])//比较大小
{
Min[j]=a[i][j];//更新最小值的值
}
}
}
7.判断及输出
for(i=1;i<=5;i++)//行
{
for(j=1;j<=5;j++)//列
{
if(a[i][j]==Max[i]&&a[i][j]==Min[j])//判断i和j是否等于最大、最小值
{
cout<<i<<" "<<j<<" "<<a[i][j];//输出行和列以及它的值
flag=1;//标记变量刷新为1
break;//跳出循环
}
}
if(flag==1)//如果标记变量为1
{
break;//跳出循环
}
}
8.输出
for(i=1;i<=5;i++)//行
{
for(j=1;j<=5;j++)//列
{
if(a[i][j]==Max[i]&&a[i][j]==Min[j])//判断i和j是否等于最大、最小值
{
cout<<i<<" "<<j<<" "<<a[i][j];//输出行和列以及它的值
flag=1;//标记变量刷新为1
break;//跳出循环
}
}
if(flag==1)//如果标记变量为1
{
break;//跳出循环
}
}
总代码
#include<iostream>
using namespace std;
int main()
{
int a[6][6],Max[6],Min[6];//定义三个数组
int i,j,flag=0;//基本变量(标记变量初值赋为0)
for(i=1;i<=5;i++)//行
{
for(j=1;j<=5;j++)//列
{
cin>>a[i][j];//输入数组行和列
}
}
for(i=1;i<=5;i++)//行
{
Max[i]=a[i][1];//最大值赋初值
}
for(j=1;j<=5;j++)//列
{
Min[j]=a[1][j];//最小值赋初值
}
for(i=1;i<=5;i++)//行
{
for(j=2;j<=5;j++)//列
{
if(a[i][j]>Max[i])//比较大小
{
Max[i]=a[i][j];//更新最大值的值
}
}
}
for(j=1;j<=5;j++)//列
{
for(i=2;i<=5;i++)//行
{
if(a[i][j]<Min[j])//比较大小
{
Min[j]=a[i][j];//更新最小值的值
}
}
}
for(i=1;i<=5;i++)//行
{
for(j=1;j<=5;j++)//列
{
if(a[i][j]==Max[i]&&a[i][j]==Min[j])//判断i和j是否等于最大、最小值
{
cout<<i<<" "<<j<<" "<<a[i][j];//输出行和列以及它的值
flag=1;//标记变量刷新为1
break;//跳出循环
}
}
if(flag==1)//如果标记变量为1
{
break;//跳出循环
}
}
if(flag==0)//如果标记变量为0
{
cout<<"not found";//输出“not found"
}
return 0;
}
OK呀,这道题三种方法都讲完了,大家学会了吗,希望大家喜欢