第一种方法
思路:依次找出每的最大元素,再判断列上该元素是否最小。依次执行。
#include<stdio.h>
int main()
{
int ctu;
do
{ //begin
int a[18][18],i,j,b,c=0,d,m,n; //b用来标记,c用来计数,d是另外的循环控制
printf("请自定义数组大小,如3*4\n");
scanf("%d*%d",&m,&n);
printf("请输入一个%d×%d的二维数组\n",m,n);
for(i=0;i<m;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]); //输入数组
for(i=0;i<m;i++) //第一层循环,控制行
for(j=0;j<n;j++) //第二层循环,控制列
{
b=1; //先前的错误就在于此,要重置b为1
for(d=0;d<n;d++) //判断是否行上最大
if(a[i][j]<a[i][d]) //for循环释义为 有a[i][d]>a[i][j]则不满足a[i][j]是在行上最大的数,所以用continue使j++,移到下个元素
{b=0;}
if(b==0)
{continue;}//跳的是j++
for(d=0;d<m;d++) //判断是否列上最小
if(a[i][j]>a[d][j]) b=0;
if(b==0)
{continue;}
c++;
printf("第%d个鞍点:%d,位于第%d行、第%d列\n",c,a[i][j],i+1,j+1);
}
if(c==0)printf("该二维数组没有鞍点");
else printf("该数组有%d个鞍点",c);
printf("\n是否继续?\n输入1继续,否则任意键退出\n"); //end
scanf("%d",&ctu);
}while(ctu==1);
return 0;
}
第二种方法
思路:同过一个行for循环 找行最大值出来,在去与行对比
#include<stdio.h>
void main()
{
int i,j,a[18][18],n,m,k,maxj=0,mini=0,max,min;
printf("请自定义数组大小,如3*4\n");
scanf("%d*%d",&m,&n);
printf("请输入一个%d×%d的二维数组\n",m,n);
for(i=0;i<m;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
if(a[i][maxj]<a[i][j])
{
maxj=j;
a[i][maxj]=a[i][j];
}
max=a[i][maxj];//记录行最大的值
for(k=0;k<m;k++)
if(a[k][maxj]<a[i][maxj])
{
mini=k;
a[i][maxj]=a[k][maxj];
}
min=a[i][maxj];
if(min==max) //continue;
printf("函数的鞍点i=%d j=%d %d\n",i,j,a[i][maxj]);
else
continue;
}
}