C语言求二维数组的鞍点

鞍点,即该位置上的元素在该行上最大,在该列上最小。也可能没有鞍点。
求 9 80 205 40
90 -60 96 1
210 -3 101 89
的鞍点
#include<stdio.h>
#define N 3
#define M 4
int main()
{
int a[N][M],max,min,i,j,k;
max=a[0][0];min=a[0][0];
printf("请输入数组:\n");
for(i=0;i<N;i++)
for(j=0;j<M;j++)
scanf("%d",&a[i][j]);
for(i=0;i<N;i++)
{ for(j=0;j<M;j++)
printf("%5d",a[i][j]);
printf("\n");
}
for(i=0;i<N;i++)
{
for(j=0;j<M;j++)
{if(max<a[i][j])
{max=a[i][j];
k=j;
}
}
for(i=0;i<N;i++)
{if(min>a[i][k])
min=a[i][k];
}
if(min==max)
printf("鞍点为:%d\n",max);
}
printf("搜索结束");
return 0;
}
我的思路算法是输入数组后再输出显示一遍,然后一行一行的比较,比较出一行的最大值max后,记住列的位置为K,然后比较K列的最小值min,如果max=min则是鞍点。
但是不知道哪里出错了,求指点。

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

int main() {  
int a[N][M],max,min,i,j,m,n;
printf("请输入数组:\n");
for(i = 0;i < N;i++)
for(j = 0;j < M;j++)
scanf("%d",&a[i][j]);
for(i = 0;i < N;i++) {
for(j = 0;j < M;j++)
printf("%5d",a[i][j]);
printf("\n");
}
for(i = 0;i < N;i++) {
max = a[i][0]; // max被赋予本行中的第一个值
for(j = 0;j < M;j++) {
if(max < a[i][j]) {
max = a[i][j];
m = j;
}
}
min = a[0][m]; // min被赋予0行m列的值
for(j = 0;j < N;j++) { // 不应该使用i作为循环变量
if(min > a[j][m]) {
min = a[j][m];
n = j;
}
}
if(min == max) printf("鞍点为:a[%d][%d] = %d\n",m,n,max);
}
printf("搜索结束\n");
return 0;
}

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-07-07

修改完成:

#include<stdio.h>

#define N 3

#define M 4

int main()

int a[N][M]={9,80,205,40,90,-60,96,1,210,-3,101,89},max,min,i,j,k;

/*printf("请输入数组:\n");

for(i=0;i<N;i++)

for(j=0;j<M;j++)

scanf("%d",&a[i][j]);

*/

for(i=0;i<N;i++)

{ for(j=0;j<M;j++)

printf("%5d",a[i][j]);

printf("\n");

}

for(i=0;i<N;i++)

{

max=a[i][0];

for(j=1;j<M;j++) 

{if(max<a[i][j])

{max=a[i][j];

k=j;

}

}

min=a[0][k];

for(j=1;j<N;j++)

{if(min>a[j][k])

min=a[j][k];

}

if(min==max)

printf("鞍点为:%d\n",max);

}

printf("搜索结束");

return 0;

}

本回答被网友采纳
第2个回答  2019-04-03

前面xoaxa的回答挺正确的,只是在后面输出鞍点的时候出错了,应该把行列位置交换下,求min时的得出位置是行的位置,求max时得出的是所在列的位置。

第3个回答  2014-04-30

#include<stdio.h>
#define N 3
#define M 4
int main()
{
    int a[N][M],max,min,i,j,k;
   
    printf("请输入数组:\n");
    for(i=0; i<N; i++)
        for(j=0; j<M; j++)
            scanf("%d",&a[i][j]);
    for(i=0; i<N; i++)
    {
        for(j=0; j<M; j++)
            printf("%5d",a[i][j]);
        printf("\n");
    }
    for(i=0; i<N; i++)
    {
     max = a[i][0];
     k = 0;
        for(j=1; j<M; j++)
        {
            if(max<a[i][j])
            {
                max=a[i][j];
                k=j;
            }
        }
        min = a[0][k];
        for(j=1; j<N; j++)
        {
            if(min>a[j][k])
                min=a[j][k];
        }
        if(min==max)
            printf("鞍点为:%d\n",max);
    }
    printf("搜索结束");
    return 0;
}