学习型 ASP/PHP/ASP.NET 主机 30元/年全能 ASP/PHP/ASP.NET 主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付
轻松建立自己的群组,招兵买马   
发新话题
打印

求鞍点程序

我昨天给做了下,结果还是有点问题,就没有给发上来,等下我回去后再做下试试。本菜鸟技术有限啊。
思路是,1.先求出没行的最大数,并用两个以为数组记录下行号和列号。在求出每列的最小值,并用另外两个一维数组记录下行号和列号。
       2.再比较记录的行号和列号,满足条件的就输出。
多看少说,重在学习!

TOP

如果说一行可以有多个等值的最大值,那么当这个二维数组的所有元素等值的话,那所有的都是鞍点.如此考虑的话就变得很复杂了

TOP

回复 14# 的帖子

LS,你写两个函数。一个是找出一行的最大值,一个是找出一行的最小值。
然后主函数调用这两个函数。
专心编程………
飞燕算法初级群:3996098
我的Blog

TOP

回复 16# 的帖子

应该分别写个找求矩正行最大值和列最小值的函数吧
然后做一个循环调用它们就可以实现了
这样想法对吗?

TOP

我写了这个程序,但运行后发现是错的,明明有鞍点却输出不存在鞍点,大家看看是哪里出问题了
#include<stdio.h>
void main()
{
    int array[5][5],i,j,max,min,a[5]={0,0,0,0,0},b[5]={0,0,0,0,0},m,n,t=0;
    printf("输入一个5×5二维数组\n");
    for(i=0;i<5;i++)
    for(j=0;j<5;j++)
    scanf("%d",&array[i][j]);
    for(i=0;i<5;i++)
        {
            max=array[i][0];
            for(j=1;j<5;j++)
            if(max<array[i][j])
            {
                max=array[i][j];
                a[i]=j;
            }

        }
        for(j=0;j<5;j++)
        {
            min=array[0][j];
                for(i=1;i<5;i++)
                    if(min>array[i][j])
                    {
                        min=array[i][j];
                        b[j]=i;
                    }
        }
        for(i=0;i<5;i++)
        {
            for(j=0;j<5;j++)
            if(a[i]=b[j])
            
            {
                m=a[i],n=b[j];
                printf("鞍点在第%d行,第%d列",++m,++n);
                printf("\n鞍点为%d",array[m][n]);
                t++;
            }
        }
        if(t==0) printf("不存在鞍点");
        printf("\n");

}

TOP

假如一个这样的矩阵,鞍点的坐标也要输出
1  5  5  5  1
1  3  3  3  1
我不管怎么弄只能输出一个啊!
我秀我自己

TOP

不知道有没对```你试试

#include<stdio.h>
#include "stdlib.h"
#define N 5
int smax(int arrar[])  /*返回最大数的下标*/
{
    int i,maxi=0;
    for(i=1;i<N;i++)
        if(arrar[i-1]<arrar[i]) maxi=i;
    return maxi;
}
void main()
{
    int array[N][N],i,j;
    int maxi=0,min=0;
    printf("input:5*5 array\n");
    for(i=0;i<N;i++)
        for(j=0;j<N;j++)
            scanf("%d",&array[i][j]);
    for(i=0;i<N;i++)
    {
        maxi=smax(array[i]);
        min=array[i][maxi];
        for(j=0;j<N;j++)
            if(min>array[j][maxi]) break;
        if(j==N) printf("%d",array[i][maxi]);   /*打印找到的鞍点*/
    }
}

TOP

这个程序不但长,而且有个缺点:如果一行有两个相等的数字都是按点,它只会输出第一个。不过暂时想部到怎么改了
复制内容到剪贴板
代码:
#include <stdio.h>
#include <limits.h>
#define M 5

int max(int iarray[][M], int irow, int ilen);
int min(int iarray[][M], int icol, int ilen);

/*main function*/
int main(void)
{
    int i, j, irow=0, icol=0, iarray[M][M];
    printf("Please a %d*%d array:\n", M, M);
    for (i=0; i<M; i++)
    {
        for(j=0; j<M; j++)
        {
            scanf("%d", &iarray[i][j]);
        }
    }
    for (i=0; i<M; i++)
    {
            icol=max(iarray, i, M);
            
            irow=min(iarray, icol, M);
            
            if (irow==i)
            {
                printf("i=%d; j=%d; value=%d\n", irow, icol, iarray[irow][icol]);
            }
    }
    return 0;
}

/*Find the max number in a row*/
int max(int iarray[][M], int irow, int ilen)
{
    int imax=INT_MIN, ipos, i;
    for (i=0; i<ilen; i++)
    {
        if (iarray[irow][i]>=imax)
        {
            imax=iarray[irow][i];
        }
    }
    for (i=0; i<ilen; i++)
    {
        if (iarray[irow][i]==imax)
        {
            ipos=i;
            break;
        }
    }
    return ipos;
}

/*Find the min number in a col*/
int min(int iarray[][M], int icol, int ilen)
{
    int imin=INT_MAX, ipos, i;
    for (i=0; i<ilen; i++)
    {
        if (iarray[i][icol]<=imin)
        {
            imin=iarray[i][icol];
        }
    }
    for (i=0; i<ilen; i++)
    {
        if (iarray[i][icol]==imin)
        {
            ipos=i;
            break;
        }
    }
    return ipos;
}
前不见古人,后不见来者。念天地之悠悠,独怆然而涕下。

TOP

#include<stdio.h>
int main()
{
    int i,j,max,min,a[5]={0,0,0,0,0},b[5]={0,0,0,0,0},m,n,t=0;
    int array[5][5]={    {1,2,5,8,9},
                        {1,2,5,5,6},
                        {1,3,4,5,8},
                        {1,2,5,4,7},
                        {5,6,5,8,9},};
    for(i=0;i<5;i++)
        {
            max=array[i][0];
            for(j=0;j<5;j++)
            if(max<array[i][j])
            {
                max=array[i][j];
                a[i]=j;
            
            }
            min=array[0][a[i]];
            for(j=0;j<5;j++)
               if(min>array[j][a[i]])
                {
                  min=array[j][a[i]];
                  b[i]=j;
                }
            printf("%d %d \n",max,min);          
            if(max==min)            
            {
                m=a[i],n=b[i];
                printf("鞍点在第%d行,第%d列",n+1,m+1);
                printf("\n鞍点为%d\n",array[n][m]);
                t++;
            }
        
        }
        if(t==0) printf("不存在鞍点");
        printf("\n");
        return 0;
}
学习需要安静。。海盗要重新来过。。

TOP

此帖不水

楼上的代码我收藏了
一上一上又一上   一上上到高山上
举头红日白云低   四海五湖皆一望

TOP

发新话题