其次,在找當前行的最大值時,y的賦值不科學,可以修改這部分程序為:
for ( i=0;i<n;i++ )
{ y=0; //假定第1個數最大
for ( j=1;j<n;j++ ) if ( num[i][j]>num[i][y] ) y=j; //這樣j循環結束後y存放當前行最大值下標
...
}
找最小數也可以用找最大數的辦法
x=0; for ( j=1;j<n;j++ ) if ( num[j][y]<num[x][y] ) x=j;
然後只要判斷求得的x是否等於i即可
由於發現鞍點是每行都要求的,而整個矩陣沒有鞍點是在所有行都找遍之後才能輸出"NO"的,所以應當把輸出"NO"的判斷拿到i循環外來進行而不是每行都要判斷是否輸出
請參考下面程序:
#define N 100
void main()
{ int b,i,j,x,y,n,num[N][N];
scanf("%d",&n); if ( n<0 ) return; else if ( n>N ) n=N;
for ( i=0,b=0;i<n;i++ )
{ y=0; for ( j=1;j<n;j++ ) if ( num[i][j]>num[i][y] ) y=j; //y列是最大值
x=0; for ( j=1;j<n;j++ ) if ( num[j][y]<num[x][y] ) x=j; //x行是y列上的最小值
if ( x==i ) { printf("%d %d\n",i,y); b=1; } //b記錄是否找到了鞍點
}
if ( b==0 ) printf("NO\n"); //n行都沒找到鞍點輸出NO
}