#include
//先找列最小,再找行最大
int main()
{ int m,n;
int i,j;
scanf("%d%d",&m,&n);//m行n列数组
int a[m][n];
for(i=0;i//输入二维数组
{
for(j=0;jscanf("%d",&a[i][j]);
}
}
printf("\n");
for(i=0;ifor(j=0;jprintf("%d ",a[i][j]);
}
printf("\n");
}
printf("\n\n");
int min,max;//列最小,行最大
int mm,nn;
int flag=1;
for(i=0;i0][i];
for(j=1;jif(min>a[j][i])//找出列最小,并标记为mm行nn列
{
min=a[j][i];
mm=j;nn=i;
}
}
max=min;//将列最小当作行最大
for(j=1;j//用列最小做行的比较,找出行最大
{
if(max0;
continue;
}
}
if(flag==1)
{
printf("鞍点是第%d行%d列的%d\n\n",mm+1,nn+1,max);
break;
}
}
if(flag==0)
printf("没有鞍点\n\n");
return 0;
}
这段代码的问题在于找行最大时,在找到行最大后没有跳出循环。导致如果下一个列最小和当前行最大相同,就会将flag重新赋值为0。
解决方法是在找到行最大后直接跳出循环。例如:
if(max<a[mm][j]){
flag=0;
continue;
}else{
printf("鞍点是第%d行%d列的%d\n\n",mm+1,nn+1,max);
break;
}
这样就可以避免上述问题