一、算法的设计
针对n*n的矩阵进行设计,操作逐行进行,在第一行找到最小值并记录其列号,然后验证它是否为所在列的最大值,如果是的话,则找到了问题的解;如果不是的话,找第二行的最小值,再进行判断…以此类推。
1. 顶层算法
for(i=0;i<n;i=i+1)
{找第i行上最小的元素t及所在列minj;
检验t是否第minj列的最大值,是则输出这个鞍点;}
2. 找到第i行上的最小元素及所在列minj
t=a[i][0];
minj=1;
for(j=1;j<n;j=j+1)
{if(a[i][j]<t)
{t=a[i][j];
minj=j;}}
3. 检验t是否为第minj列的最大值,如果是的话,则输出这个鞍点
for(k=0;k<n;k=k+1)
{if(a[k][minj]>t) { break;}}
if(k<n) { continue;}
print(“the result is a[“,i ,“][” ,minj, “]=”,t);
二、算法的伪码描述
readmtr(int a[][10],int n)
{
int i,j;
print("请输入n*n的矩阵:");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
intput(a[i][j]);
}
}
}
printmtr(int a[][10], int n)
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
print(a[i][j]);
}
print(\n);
}
}
main()
{
int a[10][10];
int i,j,k,minj,t,n=10,kz=0;
readmtr(a,n);
printmtr(a,n);
for(i=0;i<n;i++)
{
t=a[i][0];
minj=0;
for(j=0;j<n;j++)
{
if(a[i][j]<t)
{
t=a[i][j];
minj=j;
}
for(k=0;k<n;k++)
{
if(a[k][minj]>t)
{
break;
}
}
if(k<n)
{
continue;
}
print("该矩阵的鞍点为:a[",i."][",minj,"]=",t);
kz=1;
break;
}
if(kz=0)
{
print("没找到鞍点!");
}
}
}
三、算法的说明
- 算法中minj代表的是在当前行中最小值的列下标,循环变量i,j,分别代表行、列下标。循环变量k也表示的下标,在循环for(k=1;k<=n;k=k+1)中只针对minj列进行比较。
- 考虑到肯定会有无解的情况,设置一个标志量kz,kz=0代表了无解,等找到一个解后,kz被赋值为1,就不再继续进行找鞍点的工作。