| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 406 人关注过本帖
标题:鞍点问题,自己也编了一下,不行
只看楼主 加入收藏
OnlyZhu
Rank: 1
等 级:新手上路
帖 子:34
专家分:4
注 册:2015-11-10
结帖率:77.78%
收藏
已结贴  问题点数:20 回复次数:5 
鞍点问题,自己也编了一下,不行
/*找出一个二维数组中的鞍点,即该位置上的元素在该行上最大,在该列上最小,也可能没有鞍点。
假设这是四行五列的矩阵,请输入以下矩阵验证结果:
1 2 3 5 2
3 4 6 7 5
4 3 4 6 7
6 7 5 9 0
*/
#include<stdio.h>
int main()
{
    int a[4][5],i,j,m=0,n=0;
    printf("请输入数组:\n");
    for(i=0;i<4;i++)
    {
        for(j=0;j<5;j++)
        {
            scanf("%d",&a[i][j]);
        }
        printf("\n");
    }
    for(i=0;i<4;i++)
    {
        for(j=0;j<5;j++)
        {
            if(a[i][j]>a[i][j+1])
            {
                m=a[i][j];
                if(a[i][j]<a[i+1][j])
                {
                    n=a[i][j];
                    printf("鞍点为:%d\n",a[i][j]);
                }
                else
                    printf("无鞍点\n");
            }
            else
                printf("无鞍点\n");   
        }
    }
    return 0;
}
图片附件: 游客没有浏览图片的权限,请 登录注册

结果是每一个都进行了判断而不是一行一列判断,我有想过把printf放在循环体外面,结果也不行(问的有点多了新手,求理解)
搜索更多相关主题的帖子: 元素 include 
2015-11-11 17:16
li459461891
Rank: 2
等 级:论坛游民
帖 子:27
专家分:89
注 册:2015-11-5
收藏
得分:10 
>结果是每一个都进行了判断而不是一行一列判断,我有想过把printf放在循环体外面,结果也不行
解决思路如下:

1 假设当前列为i,第i行求最大,然后知道最大值所在的列m
2 第m列求最小,得出最小值所在的行n
3 如果i等于n,则你第i列最大值array[i][m]恰好在m列上是最小值array[n][m],这就是你所谓的“鞍点”

2015-11-11 18:51
li459461891
Rank: 2
等 级:论坛游民
帖 子:27
专家分:89
注 册:2015-11-5
收藏
得分:0 
程序代码:
#include<stdio.h>
int main()
{
    int i=0,j=0,m=0,n=0;
    printf("请输入数组:\n");


    int a[4][5] =
    {
        {1,2,3,5,2},
        {3,4,6,7,5},
        {4,3,4,6,7},
        {6,7,5,9,0}
    };
#if 0
    int a[4][5] =
    {
        {1,2,19,5,2},
        {3,4,18,7,5},
        {4,3,54,6,7},
        {6,7,115,9,0}
    };

   
    int a[4][5] =
    {
        {1,2,3,5,2},
        {3,4,6,7,5},
        {4,3,4,6,7},
        {6,7,5,9,0}
    };
/**************************************↓ 原来的代码,有误 ↓**************************************/
    for(i=0;i<4;i++)
    {
        for(j=0;j<5;j++)
        {
            scanf("%d",&a[i][j]);
        }
        printf("\n");
    }

    for(i=0;i<4;i++)
    {
        for(j=0;j<5;j++)
        {
            if(a[i][j]>a[i][j+1])
            {
                m=a[i][j];
                if(a[i][j]<a[i+1][j])
                {
                    n=a[i][j];
                    printf("鞍点为:%d\n",a[i][j]);
                }
                else
                    printf("无鞍点\n");
            }
            else
                printf("无鞍点\n");  
        }
    }
/**************************************↑ 原来的代码,有误 ↑**************************************/
#endif   
/**************************************↓ 解决思路 ↓**************************************/
    for(i=0;i<4;i++)
    {
        m = 0;            /* m是该行的第一个 */
        for(j=0;j<5;j++)    /* 从第一个比较到最后一个 */
        {
            if(a[i][m] < a[i][j]) /* 每行求出最大,m就是最大数的下标 */
            {
                m = j;
            }
        }
        /* n是当前行 */
        n = i;
        for(int k=0;k<4;k++)    /* m是该行最大数的下标,比较看a[n][m]是否是本列最小的数,如果是就是"鞍点" */
        {
            if(a[n][m] > a[k][m])
            {
                n = -1; // 不等于i就行
                break;
            }
        }
        if( i == n) // m是第i行最大的数,如果i=n则证明此数在第m列上最小,为"鞍点"
        {
            printf("鞍点为:%d,行列坐标为:第%d行第%d列\n",a[n][m],n+1,m+1);
        }           
        else
        {
            printf("第%d行无鞍点\n",i+1);  
        }
    }
/**************************************↑ 解决思路 ↑**************************************/
    return 0;
}
2015-11-11 18:53
OnlyZhu
Rank: 1
等 级:新手上路
帖 子:34
专家分:4
注 册:2015-11-10
收藏
得分:0 
回复 3楼 li459461891
谢谢你啊
2015-11-11 19:09
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:10 
显然是算法错误,应有3次循环,代码如下:
程序代码:
#include <stdio.h>
void main()
{
    int i,j,mr,mc;
    int a[4][5]=
    {
        1,2,3,5,2,
        3,4,6,7,5,
        4,3,4,6,7,
        6,7,5,9,0
    };
    for(i=0;i<4;i++)
    {
        for(j=0,mc=0;j<5;j++)if(a[i][j]>a[i][mc])mc=j;;   //找到i行最大数所在列到mc
        for(j=0,mr=0;j<4;j++)if(a[j][mc]<a[mr][mc])mr=j;; //找到mc所在列最小值所在行mr
        if(i==mr)printf("%d行%d列鞍点:%d\n",mr+1,mc+1,a[mr][mc]); //如果最小数mr和当前行i相等则有鞍点
        else printf("%d行没有鞍点\n",i+1);
    }
    scanf("%d",&i);
}


图片附件: 游客没有浏览图片的权限,请 登录注册

能编个毛线衣吗?
2015-11-11 19:12
OnlyZhu
Rank: 1
等 级:新手上路
帖 子:34
专家分:4
注 册:2015-11-10
收藏
得分:0 
回复 5楼 wmf2014
谢谢你
2015-11-11 19:39
快速回复:鞍点问题,自己也编了一下,不行
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.105864 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved