c语言 求二维数组的鞍点

#include<stdio.h>
int main()
{
int a[4][5],i,j,i1,j1=0,max,s=1; /*i和j是行和列的循环变量,i1和j1是一行中横向最大值所在的行标和列标,s是鞍点是否存在的标示量*/
for(i=0;i<=3;i++)
{
for(j=0;j<=4;j++)
scanf("%d",&a[i][j]);
}
printf("输入的数组:\n");
for(i=0;i<=3;i++)
{
for(j=0;j<=4;j++)
printf("%5d",a[i][j]);
printf("\n");
}
printf("\n");

for(i=0;i<=3;i++)
{
i1=i;
max=a[i1][j1];
for(j=1;j<=4;j++)
{
if(max<a[i][j])
{
max=a[i][j];
j1=j;
}
}
for(i=0;i<=3;i++)
if(max>a[i][j1])break;
if(i>3)
{
printf("a[%d][%d]=%d\n",i1,j1,max);
s=0;
}
}
if(s)
printf("不存在鞍点.\n");
return 0;
}

输入一个鞍点存在的数组,输出是正确的
但输入一个暗点不存在的数组,却没有输出,请问错在哪里?
还有如果数组中所有元素都是1,这个数组有鞍点吗?
鞍点,既该位置上的元素在该行上最大、在该列上最小,也可能没有鞍点。

sample input
1 2 3 4 5回车2 4 6 8 10回车3 6 9 12 15回车4 8 12 16 20回车
sample output
a[0][4]=5

sample input
1 12 3 4 5回车2 4 16 8 10回车3 6 9 12 15回车4 8 12 16 20回车
sample output
鞍点不存在.

第1个回答  2011-12-10
你的代码里:
for(i=0;i<=3;i++)
if(max>a[i][j1])break;
这个循环所用的控制条件是i,和外部的for循环使用的i产生了重叠,导致了相互影响。

下面这么改了以后,已经确认OK了,试试吧:

#include<stdio.h>
int main()
{
int a[4][5],i,j,k,i1,j1=0,max,s=1; /*i和j是行和列的循环变量,i1和j1是一行中横向最大值所在的行标和列标,s是鞍点是否存在的标示量*/
for(i=0;i<=3;i++)
{
for(j=0;j<=4;j++)
scanf("%d",&a[i][j]);
}
printf("输入的数组:\n");
for(i=0;i<=3;i++)
{
for(j=0;j<=4;j++)
printf("%5d",a[i][j]);
printf("\n");
}
printf("\n");

for(i=0;i<=3;i++)
{
i1=i;
max=a[i1][j1];
for(j=1;j<=4;j++)
{
if(max<a[i][j])
{
max=a[i][j];
j1=j;
}
}
for(k=0;k<=3;k++)
if(max>a[k][j1])break;
if(k>3)
{
printf("a[%d][%d]=%d\n",i1,j1,max);
s=0;
}
}
if(s)
printf("不存在鞍点.\n");
return 0;
}
第2个回答  2011-12-10
#include<stdio.h>
int main()
{
int a[3][4],i,j,i1,i2,j1=0,max,min,s=1; /*i和j是行和列的循环变量,i1和j1是一行中横向最大值所在的行标和列标,s是鞍点是否存在的标示量*/
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
scanf("%d",&a[i][j]);
}
printf("输入的数组:\n");
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
printf("%5d",a[i][j]);
printf("\n");
}
printf("\n");

for(i=0;i<3;i++)
{
i1=i;
j1=0;
max=a[i1][0];//假定每一行的开始元素为鞍点,则i1=i 指向i行,j1=0指向第一列
for(j=0;j<4;j++)
{
if(max<a[i][j])
{
max=a[i][j];
j1=j;
}
}
i2=0; //找j1所在列的最小值,比较这个最小值的行坐标和刚才最大值的行坐标是否相同,相同说明是鞍点
min=a[i2][j1];

for(j=0;j<3;j++)//这不能用i作为循环变量,和外层循环的i冲突,可以使用j
if(min>a[j][j1])i2=j;
if(i2==i1)
{
printf("a[%d][%d]=%d\n",i1,j1,max);
s=0;
}
}
if(s)
printf("不存在鞍点.\n");
return 0;
}
第3个回答  2019-01-02
不存在,题目会说明的,全是一样的,便不是鞍点
第4个回答  2011-12-10
for(i=0;i<=3;i++)
if(max>a[i][j1])break;
这个循环所用的控制条件是i,和外部的for循环使用的i产生了重叠,导致了相互影响。
更简洁明了的程序:

int main()
{
int i,j;
double max,min;
double a[5][4];

cout<<"请输入五行四列二维数组元素:"<<endl;
for (i=0;i<5;i++)
for (j=0;j<4;j++)
cin>>a[i][j];

for (i=0;i<5;i++)
{
for (j=0;j<4;j++)
cout<<setw(8)<<a[i][j];
cout<<endl;
}

for (i=0;i<5;i++)
{
max=a[i][0];
int k=0;
for (j=1;j<4;j++)
{
if (a[i][j]>max)
{
max=a[i][j];
k=j;
}
}
min=a[0][k];
int m=0;
for (j=1;j<5;j++)
{
if (min>a[j][k])
{
min=a[j][k];
m=j;
}
}
if (m==i)
cout<<"鞍点:"<<a[i][k]<<"所在行和列分别为:"<<i+1<<" "<<k+1<<endl;
else
cout<<i+1<<"行无鞍点"<<endl;
}

return 0;
}
第5个回答  2016-02-02

#include<stdio.h>

int main()

{

int a[4][4]={{2,3,9,5},{6,7,8,3},{0,5,7,5},{2,1,8,3}};

int i,j,k,i0,j0,find=0;

printf("数组a:\n");

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

{

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

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

printf("\n");

}

for(i=0;i<4;i++)        //穷举所有的行

{

j0=0;

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

 if(a[i][j]>a[i][j0])j0=j;    //找到第i行上最大的数a[i][j0]

k=1;

for(i0=0;i0<4;i0++)    //对找到的该数穷举所有行

 if(a[i0][j0]<a[i][j0])k=0;    //如它不是本列上最小的数就“一票否决”

if(k)    //若确认是,就输出,并记录已找到

{

 printf("鞍点是:a[%d][%d]=%d\n",i,j0,a[i][j0]);

 find=1;

}

}

if(!find)    //若未找到,则输出提示信息

printf("此数组无鞍点!\n");

return 0;

}