题目要求,鞍点该位置上的数,在它所在行最大且没有跟它相等的数,不知如何处理行上相等数字情况
#include<stdio.h>
int main()
{
int a[3][4],i,j,max,min,k,sum,m,sum1=0,p;
for(i=0; i<=2; i++)
{
for(j=0; j<=3; j++)
scanf("%d",&a[i][j]);
}
for(i=0; i<3; i++)
{
max=a[i][0];
k=0;
for(j=0; j<=3; j++)
{
if(a[i][j]>max)
{
max=a[i][j];
k=j;
}
}
sum=1;
for(m=0; m<3; m++)
{
if(a[m][k]<max)
sum=0;
}
for(j=0;j<=3;j++)
if(a[i][j]==max)
sum1++;//排除同行最大数相同情况
if(sum=1&&sum1<2)
{
printf("a[%d][%d]=%d",i,k,max);
break;
}
if(sum=0||sum1>=2)
printf("not exist");
return 0;
}
你代码中for循环之前没有把sum1重置为0,if(sum=1&&sum1<2)这里应该是if(sum==1&&sum1<2),下面的显示鞍点那里逻辑也不对。代码修改如下
#include<stdio.h>
int main()
{
int a[3][4],i,j,max,min,k,sum,m,sum1=0,p;
for(i=0; i<=2; i++)
{
for(j=0; j<=3; j++)
scanf("%d",&a[i][j]);
}
for(i=0; i<3; i++)
{
max=a[i][0];
k=0;
for(j=0; j<=3; j++)
{
if(a[i][j]>max)
{
max=a[i][j];
k=j;
}
}
sum=1;
for(m=0; m<3; m++)
{
if(a[m][k]<max)
sum=0;
}
sum1 =0; //这里把sum1重置为0,因为for循环是从0-3遍历所有的列
for(j=0;j<=3;j++)
if(a[i][j]==max)
sum1++;//排除同行最大数相同情况
if(sum==1&&sum1<2)//sum=1 两个等号
{
printf("a[%d][%d]=%d\n",i,k,max); //这里加一个回车,避免有多个鞍点时,输出连在一起
//break; //这里的break去掉,否则外层循环就结束了,一个二维数组中可能存在多个鞍点
}else //这里直接用else即可
//if(sum=0||sum1>=2)
printf("not exist"); //第i行没有鞍点
return 0;
}
}
就是逐行扫描,找出该行最大的数,且该数在该行只有一个,没有重复。然后再找该数所在列,这个数是不是最小的,如果还有重复的数,也不行