给定一个 n×m 的整数矩阵,求矩阵中的所有鞍点。
鞍点,即该位置上的元素在该行上最大,在该列上最小。
有可能有多个鞍点,也可能没有鞍点。
输入格式:
第一行包含两个整数 n,m(1≤n,m<10)。
接下来 n 行,每行包含 m 个整数x(1≤x<10)。
输出格式:
输出所有鞍点的坐标和值。
输出优先级,整体从上到下,同行从左到右。
如果不存在鞍点,则输出 NO。
输入样例:
3 4
1 2 3 4
1 2 3 4
1 2 3 4
输出样例:
1 4 4
2 4 4
3 4 4
纪念一下
![](https://img-blog.csdnimg.cn/img_convert/e3ef8aec1a5824b470425b8e52f329ba.png)
因为把NO写成No失去的十分。
原解:
#include<bits/stdc++.h>
using namespace std;
const int N=11;
int a[N][N];
int main()
{
int n,m;
int count=0;
int max[N]={0},min[N]={999999,99999,99999,999999,999999,999999,99999,99999,999999,99999};//真的很呆,我反省
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
if(a[i][j]>max[i]) max[i]=a[i][j];
}
}
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
{
if(a[j][i]<min[i]) min[i]=a[j][i];
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if(a[i][j]==max[i]&&a[i][j]==min[j])
{
cout<<i<<" "<<j<<" "<<a[i][j]<<endl;
count++;
}
}
if(count==0) cout<<"NO";
return 0;
}
以为自己写错了参考别人的人的解,但是别人写的思维就是美观还聪明啊。
#include<bits/stdc++.h>
using namespace std;
const int N=11;
int a[N][N];
int main()
{
int n,m;
int count=0;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
}
}
for(int i=1;i<=n;i++)
{
int max=0;
int col;//记录最大值的列坐标
int f=1;
for(int j=1;j<=m;j++)
{
if(a[i][j]>max){
max=a[i][j];
col=j;
}
}
for(int k=1;k<=n;k++)
{
if(a[k][col]<max) f=0;//判断在当前列中是否有比这一行的这个数字更小的数字
}
if(f==1){
count++;
cout<<i<<' '<<col<<' '<<a[i][col]<<endl;
}
}
if(count==0)
{
cout<<"NO";
}
return 0;
}