请找出二维数组b[5][4]中的鞍点,鞍点指该位置上的元素值在该行中最大,且在该列中最小。如果有鞍点,请输出其下标值;如果没有鞍点,请给出没有鞍点的提示信息

本题代码如下:
#include <stdio.h>
int main()
{
int a[5][4];
int i,j,k;
int max,min,row,column;
printf("Please enter figures:\n");
for(i=0;i<5;i++)
{
for(j=0;j<4;j++)
{
scanf("%d",&a[i][j]);
}
}
for(i=0;i<5;i++)
{
max=a[i][0];
column=0;
for(j=0;j<3;j++)
{
if(max<a[i][j+1])
{
max=a[i][j+1];
column=j+1;
}
}
printf("\nmax=%d,column=%d\n",max,column);
min=a[0][column];
row=0;
for(k=0;k<4;k++)
{
if(min>a[k+1][column])
{
min=a[k+1][column];
row=k++;
}
}
printf("\nmin=%d,row=%d\n",min,row);
if(max!=min)
{
if(i>=4) printf("\nThere is no saddle point for this array\n");
}
else
{
printf("\n%d is the saddle point of this array\n",a[row][column]);
break;
}
}
return 0;
}
但是它只适用于鞍点在第一行的情况,试问哪里出了问题?

题主写的逻辑感觉有点混乱,按照题目意思就是找到一个元素,该元素在行中是最大,列中是最小。
下面是我写的代码:

#include <stdio.h>
int main()
{
    int a[5][4];
    int i,j,k;
    int max,min,row,column;
    printf("Please enter figures:\n");
    for(i=0;i<5;i++){
        for(j=0;j<4;j++){
            scanf("%d",&a[i][j]);
        }
    }
    
    for(i=0;i<5;i++){
        max = a[i][0];
        //寻找每一行的最大值及位置 
        for(j = 1;j < 4;j++){
            if(max < a[i][j]){
                max = a[i][j];
                row = i;
                column = j;
            }
        }
        
//        寻找该最大值所在列是否为最小值,确定是否为 鞍点 
        bool flag = true;
        for(k = 0;k < 5;k++){
            if(a[k][column] < max){
                flag = false;
                printf("\nThere is no saddle point for this array[%d]\n",i);
                break;
            }
        }
        
        if(flag)
            printf("\n%d is the saddle point of this array[%d]\n",max,i);
        
    }
    return 0;
}

测试时候自己构造样例就行。

img


比如:

4 5 3 1
2 6 7 9
6 7 4 2
4 8 9 2
1 4 1 2

#include <stdio.h>
#include <stdlib.h>
#define M 4
#define N 3

int main()
{
    int a[M][N];

    printf("Please Enter 12 figures:\n");
    for(int i=0;i<M;i++)
    {
        for(int j=0;j<N;j++)
        {
            scanf("%d",*(a+i)+j);
        }
    }

    int i,j,k,p,flag;
    int max_x,max_y;
    for(i=0;i<M;i++)
    {
        p=0;//找出行最大值的坐标。
        for(j=1;j<N;j++)
        {
            if(a[i][p]<a[i][j])
                p=j;
        }
        max_x=p;
        max_y=i;

        flag=1;//判断行最大值是否为列最小值
        for(k=0;k<M;k++)
        {
            if(a[max_y][max_x]>a[k][max_x])
                flag=0;
        }
        if(flag)
            printf("(%d,%d)\n",max_y,max_x);
        else
            printf("No point!\n");
    }
}