问题重述
求一个矩阵的鞍点(即在行上最大而在列上最小的点)。
算法设计
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 }