题目要求
在一个矩阵中,有这样的元素:它在该行中最大,而在该列中最小。我们把这样的元素称为“鞍点”。一个矩阵可能没有鞍点,要存在鞍点也只能有一个。任意输入一个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;i<m;i++)
{
max=0; //记录第i行中最大值的列数
flag=1;
for(j=1;j<n;j++) //找出第i行中的最大元素的位置A[i][max]
{
if(A[i][j]>A[i][max])
max=j;
}
for(k=0;k<n;k++)
if(A[i][max]==A[i][k]&&max!=k)
{
flag=0;
break;
}
if(flag==1)
for(k=0;k<m;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();
}