问题标题: 酷町堂:2554 行最小列最大

0
0
已解决
许天奕
许天奕
新手守护
新手守护

2554   行最小列最大

题目描述 Description

给一个n*n的矩阵,每行只有一个最小值,每列只有一个最大值,请你寻找这个矩阵中的某个元素,它既是所在行的最小值也是所在列的最大值。如果该矩阵中没有某个元素满足时行最小值且是列最大值,则输出“N”。

输入描述 Input Description

第一行:n,1<n<10
接下来n行:n*n的矩阵

输出描述 Output Description

如果找到了某个元素值既是行最小值又是列最大值,则输出该元素的值,第几行,第几列
如果没有找到这样的元素则输出N

样例输入 Sample Input

5
11 12 10 8 15
3 4 5 6 10
5 7 6 4 11
6 8 9 7 20
9 10 11 2 25

样例输出 Sample Output

8 1 4

错误代码(Wrong Answer:50分)

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int k,n,i2,j2,max,min,a[100][100];
    cin>>n;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            cin>>a[i][j];
    max=min=a[1][1];
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(max>a[i][j]){
                max=a[i][j];
                i2=i;
                j2=j;
            }
        }
        for(k=1;k<=n;k++)
            if(max<a[k][j2])break;
        if(k>n){
            cout<<max<<' '<<i2<<' '<<j2<<endl;
            return 0;
        }
    }
    cout<<"N"<<endl;
    return 0;
} 

请问我哪儿错了???


0
已采纳
栾峻岩
栾峻岩
初级天翼
初级天翼

先找出来每一行的最小值,用b数组记录。

再找出每一列的最大值,用c数组记录。

然后两重循环,记录b[i]是否等于c[j],如果相等,则输出,并用flag记录为true。

如果到最后依旧flag依旧为false,则输出N。

类似题目叫矩阵鞍点,结果被放到队列里面去了。

 

根据这个思路重构代码吧,你这程序明显有问题。

 

0
0
傅文彬
傅文彬
新手天翼
新手天翼

找出来每一行的最小值,用b数组记录。

再找出每一列的最大值,用c数组记录。

然后两重循环,记录b[i]是否等于c[j],如果相等,则输出,并用flag记录为true。

如果到最后依旧flag依旧为false,则输出N。

我要回答