問題重述
求一個矩陣的鞍點(即在行上最大而在列上最小的點)。
算法設計
1)在第一行找最小值,並記錄其列號。
2)然后驗證其是否為所在列的最大值,如果是,則找到問題的解;
否則,則繼續在下一行找最小值 …… 。
1>頂層算法
1 for(i=0;i<n;i=i+1) 2 { 找第i行上最小的元素t及所在列minj; 3 檢驗t是否第minj 列的最大值,是則輸出這個鞍點;}
2>找第i行上最小的元素t及所在列minj
t=a[i][0]; minj=0; for(j=1;j<n;j=j+1) if(a[i][j]<t) { t=a[i][j]; minj=j; }
3>檢查minj是否是列最大的值,是則輸出
for(k=0;k<n;k=k+1) if(a[k][minj]>t) break; if(k>=n) print(“the result is a[“,i ,“][” ,minj, “]=”,t);
代碼如下:
1 #include<stdio.h> 2 #define N 3 3 4 int main(){ 5 int array[N][N]={1,2,3,4,5,6,7,8,9}; 6 int i,j,min,max,k; 7 8 printf("數組有:\n"); 9 for(i=0;i<N;i++) 10 { 11 for(j=0;j<N;j++) 12 printf("%-5d\t",array[i][j]); 13 printf("\n"); 14 } 15 for(i=0;i<N;i++){ 16 max=array[i][0]; 17 for(j=0;j<N;j++){ 18 if(max<array[i][j]) 19 max=array[i][j]; 20 k=j; 21 } 22 min=array[0][k]; 23 if(min>array[i][k]) 24 min=array[i][k]; 25 if(max==min) 26 printf("\na[%d][%d]=%d",i+1,k+1,array[i][k]); 27 } 28 }