寻找矩阵中的“鞍点”

题目要求
在一个矩阵中,有这样的元素:它在该行中最大,而在该列中最小。我们把这样的元素称为“鞍点”。一个矩阵可能没有鞍点,要存在鞍点也只能有一个。任意输入一个5*5的矩阵,寻找该矩阵中的鞍点,并将它在矩阵中的位置输出。

算法描述:

对于一个m*n的矩阵
Repeat:
   找出第i行中最大的元素A[i][t];
   If(本行中有与元素A[i][t]的值相等的元素)
          Then本行中没有鞍点,执行i<--i+1,并跳出本次Repeat循环;
   Else将元素A[i][t]与第t列的每个元素进行比较,
        If(存在小于或等于A[i][t]的元素)
              Then说明A[i][t]不是鞍点,执行i<--i+1,并跳出本次Repeat循环;
        Else元素A[i][t]是鞍点,返回该元素在矩阵中的位置(i,t),程序结束
Until i>=m;
返回0,该矩阵中无鞍点。

程序实现:

#include"stdio.h"
#include"conio.h"
int getsaddlepoint(int *x,int *y,int (*A)[5],int m,int n)
{
        int max,i,j,k,flag;
        for(i=0;imax=0;               //记录第i行中最大值的列数
              flag=1;
              for(j=1;j//找出第i行中的最大元素的位置A[i][max] 
              {
                   if(A[i][j]>A[i][max])
                           max=j;
              }
              for(k=0;kif(A[i][max]==A[i][k]&&max!=k)
                       {
                              flag=0;
                              break;
                       }
              if(flag==1)
              for(k=0;k//判断是否为列最小
             {
                    if(A[k][max]<=A[i][max]&&k!=i)  //不是最小
                    {
                         flag=0;
                         break;
                    }
             }
             if(flag==1)   //找到鞍点,用x,y返回,程序结束
             {
                    *x=i;
                    *y=max;
                    return 1;
             }
        }
        return 0;
}

main()
{
     int A[5][5],i,j,k,x,y;
     printf("Please input some digit into the matrix\n");
     for(i=0;i<5;i++)
         for(j=0;j<5;j++)
             scanf("%d ",&A[i][j]);
             if(getsaddlepoint(&x,&y,A,5,5))
                  printf("\nsaddlepoint is at (%d,%d)",x+1,y+1);
             else
                   printf("\nThere is no saddlepoint in the matrix\n");
                   getche();
}

你可能感兴趣的:(算法设计与分析)