鞍点:在二维数组中,若一个数字在其所在的行上最大,在其所在的列上最小,则这一位置称为鞍点。(二维数组也存在没有鞍点的情况。)
相关问题:
《C程序设计》(第三版)6.8
《C程序设计教程》7.8
分析:
什么样的二维数组没有鞍点?如果某行有两个或以上并列大的最大数,那存不存在最大数?
1 3 3
0 4 4
0 5 5
经过一番思考,觉得最大数只有一个,否则不为最大数。
以上二维数组没有鞍点!
Solution by Mutoo:
- #include<stdio.h>
- #define MAX 3
- void main()
- {
- //const MAX=3; // 3x3 矩阵
- float a[MAX][MAX],sp;
- int i,j,k,flag=1;
- int row,col;
- do
- {
- // 输入数字
- printf("Pleae input a %dx%d array:/n",MAX,MAX);
- for(i=0;i<MAX;i++)
- for(j=0;j<MAX;j++)
- scanf("%f",&a[i][j]);
- row=col=-1;
- for(i=0;i<MAX&&row==-1;i++)
- for(j=0;j<MAX;j++)
- {
- // 判断a[i][j]是否为该行最大的数
- // (区别于最大值,最大数只有一个,否则不为最大数)
- flag=1;
- for(k=1;k<MAX;k++)
- {
- if(a[i][j]<=a[i][(j+k)%MAX])
- {
- // 该行存在比a[i][j]大或相等的数
- // a[i][j]不是该行的最大数
- flag=0;
- break;
- }
- }
- if(!flag) continue;
- else
- {
- // a[i][j]是该行的最大数
- // 则判断其是否为该列最小数
- col=j;
- flag=1;
- for(k=1;k<MAX;k++)
- {
- if(a[(i+k)%MAX][col]<=a[i][col])
- {
- flag=0;
- break;
- }
- }
- if(flag){
- row=i;
- break;
- // 已找到鞍点
- }
- }
- }
- // 输出二维数组
- for(i=0;i<MAX;i++)
- {
- for(j=0;j<MAX;j++)
- printf("%6.1f",a[i][j]);
- printf("/n");
- }
- if(row==-1||col==-1) // 没有找到鞍点
- printf("There doesn't have Saddle Point!/n");
- else // 输出鞍点
- {
- sp=a[row][col];
- printf("the Saddle Point is in row %d, col %d: %f/n",row+1,col+1,sp);
- }
- fflush(stdin);
- }while(1);
- }