| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1977 人关注过本帖
标题:找马鞍点!
只看楼主 加入收藏
王一南
Rank: 1
等 级:新手上路
帖 子:29
专家分:0
注 册:2010-11-29
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:7 
找马鞍点!
#include<stdio.h>
#define M 100
#define N 100
main()
{

    int i,j,k,p,q,temp,small;
    int a[M][N];   
    printf("请输入您想输入的矩阵的行数和列数:\n");
    scanf("%d %d",&p,&q);
    printf("请按行输入矩阵(%d行%d列):\n",p,q);
    for(i=0;i<p;i++)
    {
        for(j=0;j<q;j++)
        {
            scanf("%d",&a[i][j]);   
        }
    }
      temp=1;
    for(i=0;i<p;i++)//控制换行
    {
        small=a[i][0];
        for(j=0;j<q;j++)
        {
            if(small>a[i][j])
                small=a[i][j];//记录最小数 8
        
            if(a[i][j]==small)//处理在i行中等于small的元素
            {
                for(k=0;k<p;k++)//从该列的第一个元素比较
                {
                    if(small<a[k][j])
                        temp=0;//small不是列最大
                }
                if(temp=1)   
                    printf("a[%d][%d]=%d是所输矩阵的马鞍点\n",i,j,small);//当循环正常结束时,则为马鞍点
            }

        }
    }
    if(temp=0) printf("您输入的矩阵无马鞍点!");

   
   

}
这个程序为什么运行不出来马鞍点,希望高手指点!
搜索更多相关主题的帖子: include 
2011-04-17 11:18
诸葛修勤
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:11
帖 子:549
专家分:1955
注 册:2010-10-28
收藏
得分:7 
找马鞍点

什么意思 这句话?
2011-04-17 11:59
王一南
Rank: 1
等 级:新手上路
帖 子:29
专家分:0
注 册:2010-11-29
收藏
得分:0 
回复 2楼 诸葛修勤
就是想找马鞍点,结果运行不出来结果,希望给小弟解决哈!
感觉for循环关系理得不是很清楚!

[ 本帖最后由 王一南 于 2011-4-17 12:51 编辑 ]
2011-04-17 12:49
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:7 
狭义的鞍点是指矩阵中的一个元素,它拥有“在其所在列中,它是最小元素;而在其所在行里,它是最大元素”的性质。
楼主找的好像是行最小列最大。不过也没事,应该是差不多的意思。

矩阵的鞍点在搞对策博弈之类的问题时会经常用到。
方法一般是扫描每一行,把最大值记住。再在所有得到的最大值中找一个最小值。如果鞍点存在,好像一定是这个值,验证一下就行了。如果不是鞍点就说明这个矩阵没有鞍点。
如果是楼主说的那种“鞍点”,就用相反的找就行了。

我现在记的也不是很清楚,说的算法可能不对。有兴趣的自己找找资料呗。
2011-04-17 13:43
诸葛修勤
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:11
帖 子:549
专家分:1955
注 册:2010-10-28
收藏
得分:0 
程序代码:
/*
鞍点
*/
#include <stdio.h>

#define M 100
#define N 100

struct node
{
    int col;//
    int row;//
};

int array[M][N] = {0};
int p = 0;//
int q = 0;//

void init_array()
{
    int i,j;
   
    printf("请输入您想输入的矩阵的行数和列数:\n");
    scanf("%d %d",&p,&q);
    printf("请按行输入矩阵(%d行%d列):\n",p,q);
    for(i=0;i<p;i++)
    {
        for(j=0;j<q;j++)
        {
            scanf("%d",&array[i][j]);   
        }
    }
}

//找出行数为row中最小数的下标值
int search(int row)
{
    int index = 0;
    int recode = 0;

    for (; index < q; ++index)
    {
        if ( array[row][recode] > array[row][index] )
        {
            recode = index;
        }
    }

    return recode;
}

//判断下标index在col列中是否为最大 是返回true
bool is_col_max(int col, int index)
{
    int i = 0;

    for (; i<p; ++i)
    {
        if ( i != index && array[index][col] <= array[i][col] )
        {
            return false;
        }
    }

    return true;
}

void deal()
{
    int sum_row = 0;//待处理的总行数计数器

    if ( p != sum_row )
    {
        ++sum_row;
    }
    else
    {
        return;
    }

    struct node index, temp;

    index.row = sum_row - 1;
    index.col = search(sum_row-1);//找出最小值的下标 sum_row行中

    while (p != sum_row)
    {
        ++sum_row;
        if ( array[index.row][index.col] > array[sum_row-1][index.col] )
        {//如果满足在列数上保持最大值 的记录 则不更改马鞍点
        }
        else
        {
            temp.row = sum_row - 1;
            temp.col = search(temp.row);

            if (temp.col == index.col)
            {//更改马鞍点
                index = temp;
            }
            else
            {
                if (is_col_max(temp.col, temp.row))
                {//更改马鞍点
                    index = temp;
                }
                else
                {//暂时没有满足条件的马鞍点
                    index.col = -1;//表示没有满足的

                    if ( p != sum_row )
                    {
                        ++sum_row;
                    }
                    else
                    {
                        break;
                    }

                    index.row = sum_row - 1;
                    index.col = search(sum_row-1);
                }
            }
        }
    }
    if ( index.col == -1 )
    {
        printf("\t您输入的矩阵无马鞍点!\n");
    }
    else
    {
        if ( is_col_max(index.col, index.row) )
        {
            printf("\t%d\n", array[index.row][index.col]);
        }
        else
        {
            printf("\t您输入的矩阵无马鞍点!\n");
        }
    }
   
}

int main(void)
{
    init_array();

    deal();

    return 0;
}
2011-04-17 15:58
诸葛修勤
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:11
帖 子:549
专家分:1955
注 册:2010-10-28
收藏
得分:0 
  唉 写的不成样子啦
2011-04-17 15:58
王一南
Rank: 1
等 级:新手上路
帖 子:29
专家分:0
注 册:2010-11-29
收藏
得分:0 
回复 6楼 诸葛修勤
怎么写的这么多?不是写很少就可以吗?
2011-04-17 16:12
liuyangxi
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2012-3-28
收藏
得分:0 
#include<stdio.h>
#define M 100
#define N 100
void main()
{

    int i,j,k,p,q,temp,small;
    int a[M][N];   
    printf("请输入您想输入的矩阵的行数和列数:\n");
    scanf("%d %d",&p,&q);
    printf("请按行输入矩阵(%d行%d列):\n",p,q);
    for(i=0;i<p;i++)
    {
        for(j=0;j<q;j++)
        {
            scanf("%d",&a[i][j]);   
        }
    }
      //temp=1;这个没用的
    for(i=0;i<p;i++)//控制换行
    {
        small=a[i][0];
        for(j=0;j<q;j++)
        {
            if(small>a[i][j])
                small=a[i][j];//记录最小数 8
        
            if(a[i][j]==small)//处理在i行中等于small的元素
            {
                for(k=0;k<p;k++)//从该列的第一个元素比较
                {
                    if(small<a[k][j])
                        temp=0;//small不是列最大
                    else//添加的else语句
                        temp=1                }
                if(temp==1)    //if 里的语句是==,您只写了=
                    printf("a[%d][%d]=%d是所输矩阵的马鞍点\n",i,j,small);//当循环正常结束时,则为马鞍点
            }

        }
    }
    if(temp==0) printf("您输入的矩阵无马鞍点!");//同上面得到if语句

    //初来乍到,有不对的地方请各位指教
   

}
2012-03-28 21:51
快速回复:找马鞍点!
数据加载中...
 
   



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

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