初莫M 发表于 2023-11-10 20:44:28

为什么有些数据结果错误啊

输入描述
输入数据有多行,第一行有两个数m
和n
,下面有m
行,每行有n
个数。

输出描述
按下列格式输出鞍点:
i
j
x

其中,x
代表鞍点,i
和j
为鞍点所在的数组行和列下标,我们规定数组下标从0开始。
一个二维数组并不一定存在鞍点,此时请输出None。

样例
输入 复制
3 3
1 2 3
4 5 6
7 8 9
输出 复制
0 2 3
提示
1≤m,n≤10
。数据中的元素在int范围内

提示:可能存在多个鞍点,请在每一行输出一个。
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int a,m,n;int flag1=0;
    cin>>m>>n;
    int i,j,k;
    for(i=0;i<m;i++)
      for(j=0;j<n;j++)
                   cin>>a;
    for(i=0;i<m;i++)
    {
      int max=a;int l=0;
      for(j=0;j<n;j++)
      {
            if(a>max)
            {
                max=a;
                l=j;
             }
      }
      int flag=0;
      for(k=0;k<m;k++)
      {
            if(a<max) {flag=1;break;}
      }
      if(!flag)
      {
            flag1=1;cout<<i<<' '<<l<<' '<<max<<endl;
      }
    }
    if(!flag1) cout<<"None";
}

isdkz 发表于 2023-11-10 20:44:41

这段代码的问题在于它只考虑了每行中的最大值,但没有考虑每列的最小值。鞍点的定义是在数组中找到一个元素,它是所在行的最大值,同时也是所在列的最小值。因此,我们需要在代码中加入对每列最小值的判断。

以下是修改后的代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int a,m,n;
    int flag1=0;
    cin>>m>>n;
    int i,j,k;
    for(i=0;i<m;i++)
      for(j=0;j<n;j++)
            cin>>a[ i];
    for(i=0;i<m;i++)
    {
      int max=a[ i];
      int l=0;
      for(j=0;j<n;j++)
      {
            if(a[ i]>max)
            {
                max=a[ i];
                l=j;
            }
      }
      int flag=0;
      for(k=0;k<m;k++)
      {
            if(a<max) {
                flag=1;
                break;
            }
      }
      if(!flag)
      {
            int min_in_col = a;
            int row_index = 0;
            for (int p = 1; p < m; p++) {
                if (a < min_in_col) {
                  min_in_col = a;
                  row_index = p;
                }
            }
            if (row_index == i) {
                flag1=1;
                cout<<i<<' '<<l<<' '<<max<<endl;
            }
      }
    }
    if(!flag1) cout<<"None";
}
页: [1]
查看完整版本: 为什么有些数据结果错误啊