偶然间,看到一个寻找鞍点的小问题,仔细想想,很多人的程序设计的都不能很好的解决每一行有多个最大值的情况(包括谭浩强的版本,竟然写的那么不严密,误人子弟啊)
自己敲了一个。
首先,解释一下鞍点的概念:这个点应该既是行的最大值同时又是列的最小值。
不说没用的,贴上代码:
/*
寻找SaddlePoint:即同时是行的最大值和列的最小值。
@author:Apart1.424.sci&teque.ncepu;
2012.6.11
*/
/*
主要针对每一行可能最大值相等的有多个这一问题设计的算法。
algorithm:
2次遍历:第一次遍历寻找每行的最大值,第二次判断最大值的元素是否为最小值。
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void main()
{
int m,n,i,j,k;
int *nRowMax,**mat;//mat保存矩阵,nRowMax保存每行的最大值
printf("请输入矩阵的行数和列数:");
scanf("%d %d",&m,&n);
mat=(int **)malloc(m*sizeof(int *));
for(i=0;i<m;i++)
mat[i]=(int *)malloc(n*sizeof(int));
nRowMax=(int *)malloc(m*sizeof(int));
memset(nRowMax,0,m);//根据需要设置矩阵的最小值
printf("请输入矩阵:\n");//输入的同时,判定每行的最大值
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&mat[i][j]);
if(mat[i][j]>nRowMax[i])
nRowMax[i]=mat[i][j];
}
}
//第二次遍历 判断最大值的元素是否是列的最小值
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
if(mat[i][j]==nRowMax[i])
{
for(k=0;k<m;k++)
{
if(mat[k][j]<nRowMax[i])
break;
}
if(k==m)
printf("Saddle Point:%d,(%d,%d)\n",nRowMax[i],i+1,j+1);
}
}
}
}