找出一个二维数组的鞍数,但不知道为什么程序运行结果总是不对

#include<stdio.h>
int main() {
int a[3][3],i,j,hang,lie,max,d; //定义2维数组
for(i=0; i<=2; i++)
for(j=0; j<=2; j++)
scanf("%d",&a[i][j]);//给数组赋值
for(i=0; i<=2; i++) {
max=a[i][0];
hang=i,lie=0;
for(j=0; j<=2; j++) {
if(a[i][j]>max) {
max=a[i][j];
hang=i,lie=j; //确定出每行的最大值
}
d=0;
for(i=0; i<=2; i++)
if(max>a[i][lie])
d=1; //判断此元素是否为该列最小值
if(d==0)
printf("%d为鞍数\n%d为行数\n%d为列数\n",max,hang,lie);//输出 结果
}
}
if(d)
printf("没有鞍数\n");//输出结果
return 0;
}

#include<iostream>
using namespace std;

/* 求一个n×m数组中的马鞍数,并输出它的位置。
马鞍数:指矩阵n*m中,在行上最小而在列上最大的数 */
#define N 100
int main()
{
    int n, m;        // 行数和列数
    int a[N][N];    // 二维数组
    int value, row, col;    // 马鞍数及其所在行号和列号
    int flag = 0;            // 马鞍数是否存在的标志,0表示不存在,1表示存在
    cout << "请分别输入数组的行数和列数:";
    cin >> n >> m;
    for (int i = 0;i < n;i++)
        for (int j = 0;j < m;j++)
            cin >> a[i][j];
    for (int i = 0;i < n;i++)
    {
        int min = a[i][0];
        row = i;
        col = 0;
        for (int j = 1;j < m;j++)
        {
            if (a[i][j] < min)
            {
                min = a[i][j];
                col = j;
            }
        }
        int max = a[0][col];
        for (int k = 0;k < n;k++)
        {
            if (a[k][col]>max)
            {
                max = a[k][col];
            }
        }
        if (max == min)
        {
            flag = 1;
            value = max;
            cout << "马鞍数为:" << value << " ";
            cout << "在数组中的位置是:" << i + 1 << "行" << col + 1 << "列" << endl;
        }
    }

    if (!flag)
        cout << "该数组不存在马鞍数!" << endl;
    system("pause");
    return 0;
}

思路:先找到一行中的最小值,确定了最小值以及所在列号,在从该列找最大值,如果在这一列中找到的最大值与之前找到的最小值相等,就说明这个数为马鞍数,确定所在行数和列数

假设在同一行里,你有两个相同的最大数,但是你的程序只判断了第一个出现最大数的那一列,而那一列不一定是答案所在的列。

你这个i都被你给改变了,你要么在后面加一个i=hang

供参考:

#include<stdio.h>
int main() 
{
    int a[3][3], i, j, max, d, k, flg = 0; //定义2维数组
    for (i = 0; i <= 2; i++)
        for (j = 0; j <= 2; j++)
            scanf("%d", &a[i][j]);//给数组赋值
    for (i = 0; i <= 2; i++) {
        max = a[i][0];
        for (j = 0; j <= 2; j++) {
            if (a[i][j] > max) 
                max = a[i][j]; //确定出每行的最大值
        }
        for (j = 0; j <= 2; j++) {
            if (a[i][j] == max) {
                d = 0;
                for (k = 0; k <= 2; k++)//for (i = 0; i <= 2; i++)
                    if (max > a[k][j])
                        d = 1; //判断此元素是否为该列最小值
                if (d == 0){
                    flg++;
                    printf("%d为鞍数\n%d为行数\n%d为列数\n", max, i, j);//输出 结果
                }
            }
        }
    }
    if (flg == 0)
        printf("没有鞍数\n");//输出结果
    return 0;
}