求一个矩阵的鞍点,即在行上最小、列上最大的点

一、算法的设计

针对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("没找到鞍点!");
        }
    }
}

三、算法的说明

  1. 算法中minj代表的是在当前行中最小值的列下标,循环变量i,j,分别代表行、列下标。循环变量k也表示的下标,在循环for(k=1;k<=n;k=k+1)中只针对minj列进行比较。
  2. 考虑到肯定会有无解的情况,设置一个标志量kz,kz=0代表了无解,等找到一个解后,kz被赋值为1,就不再继续进行找鞍点的工作。
发布了28 篇原创文章 · 获赞 13 · 访问量 458

猜你喜欢

转载自blog.csdn.net/yo_u_niverse/article/details/105443015
今日推荐