| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 19789 人关注过本帖
标题:求二维数组的鞍点,求助!
只看楼主 加入收藏
wwfdzh2012
Rank: 2
等 级:论坛游民
帖 子:88
专家分:27
注 册:2012-11-22
结帖率:94.12%
收藏
已结贴  问题点数:20 回复次数:6 
求二维数组的鞍点,求助!
程序代码:
#include<stdio.h>
#define M 4
#define N 3
void main()
{
    int i,j,a[M][N],b,c,d,m; //d判断是否有鞍点的变量,m为在该行的最大值,b,c记录序号。
    printf("请输入%d*%d个数",M,N);
    for(i=0;i<M;i++)
        for(j=0;j<N;j++)
            scanf("%d",&a[i][j]);
    printf("矩阵为\n");
    for(i=0;i<M;i++)
    {
        for(j=0;j<N;j++)
            printf("%-5d",a[i][j]);
        printf("\n");
    }
    for(i=0;i<M;i++)
    {
        m=a[i][0];
        b=i,c=0;
        for(j=0;j<N;j++)
            if(a[i][j]>m)
            {
                m=a[i][j];
                b=i,c=j;
            }
        d=1;
        for(j=0;j<M;j++)
        {
            if(m>=a[j][c])
            {d=0;continue;}
       
        }
        if(d==1)
        {
            printf("鞍点为a[%d][%d]=%d",b,c,a[b][c]);
            break;
        }   
    }
        if(d!=1)printf("此矩阵无鞍点!");   
}
不知道哪里错了,帮忙指点下,最好告诉我为什么不行,谢谢

[ 本帖最后由 wwfdzh2012 于 2012-12-30 22:45 编辑 ]
2012-12-30 22:43
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
上面的for运行完,m值为当行最大值

标记d 值为1, 然后应该。。

判断是否为该列最小值,也就是说,那应该是 <= 号才对

另外,如果不是break就可以,不必继续判断



[fly]存在即是合理[/fly]
2012-12-30 22:56
ksddah
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:53
专家分:135
注 册:2012-12-11
收藏
得分:0 
程序代码:
#include<stdio.h>
#define M 4
#define N 3
int main()
{
    int i,j,a[M][N],b,c,d,m;      //d判断是否有鞍点的变量,m为在该行的最大值,b,c记录序号。
    printf("请输入%d*%d个数",M,N);
    for(i=0;i<M;i++)
        for(j=0;j<N;j++)
            scanf("%d",&a[i][j]);
    printf("矩阵为\n");
    for(i=0;i<M;i++)
    {
        for(j=0;j<N;j++)
            printf("%-5d",a[i][j]);
        printf("\n");
    }
    
    
    for(i=0;i<M;i++)
    {
        m=a[i][0];
        b=i,c=0;
        for(j=0;j<N;j++)
            if(a[i][j]>m)
            {
                m=a[i][j];
                b=i,c=j;
            }
        d=1;
        for(j=0;j<M;j++)
        {
            if(m>a[j][c])  
            {d=0;break;}    //如果有元素比m小,那么当前点肯定不是鞍点 ,跳出循环,开始下一行的判断 
           
        }
        if(d==1)
        {
            printf("鞍点为a[%d][%d]=%d",b,c,a[b][c]);
            //break;               //不用跳出,因为鞍点可能还有,不止一个 
        }   
    }
        //if(d!=1)printf("此矩阵无鞍点!");     //这句有问题了,比如第一行有鞍点d=1了,但
                                                //第三行没有鞍点, 此时d=0,用了这句岂不是整个矩阵没有鞍点?可以通过记录鞍点的个数来判断 
}
//还有,这个方法在矩阵有相同元素时,结果可能是错的,可以再研究下。
2012-12-31 12:13
wwfdzh2012
Rank: 2
等 级:论坛游民
帖 子:88
专家分:27
注 册:2012-11-22
收藏
得分:0 
回复 3楼 ksddah
一个矩阵不是只有一个鞍点吗或者没有吗?
2012-12-31 19:04
ksddah
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:53
专家分:135
注 册:2012-12-11
收藏
得分:10 
回复 4楼 wwfdzh2012
对的,疏忽了,重新改了下,应该符合要求了
程序代码:
#include <stdio.h>
#include <stdlib.h>
#define M 3
#define N 3 

int main()
{
    int arr[M][N]={1,1,1,3,1,2,1,3,1};
    int flag;                     //鞍点的标志 
    int x,y;                      // 记录鞍点的行号和列号
    int count=0;                  //记录鞍点的个数 
    int temp;
    int i,j,k;
    for(int m=0;m<M;m++)
       {
        for(int n=0;n<N;n++)
        {
          printf("%4d",arr[m][n]);
        }
        printf("\n");
       }
          
    for(i=0;i<M;i++)
    {
        temp=arr[i][0];           //找出第i行的最大值,记录其列号y 
        x=i;y=0;
        for(j=1;j<N;j++)
        {
            if(temp<arr[i][j])
            {
               temp=arr[i][j];
               y=j;
            }
        }
        flag=1;                    //假设当前点为鞍点 
        for(k=0;k<M;k++)           //判断上述第i行,列号为y的最大值是否为第y列的最小值 
        {                                    
            if(temp>=arr[k][y]&&k!=i)  //去除重复      
            {
               flag=0;
               break;             //跳出是为了后面计数用的 
            }
        }
        
        if(flag==1)
        { 
           printf("鞍点是arr[%d][%d]=%d\n",x,y,arr[x][y]);
           count++;
        }
    }
    
    if(count==0)printf("该矩阵没有鞍点\n");
    else printf("该矩阵有%d个鞍点\n",count); 
    return 0;
    system("pause");
}


     
2012-12-31 23:35
尹金魁2031
Rank: 3Rank: 3
来 自:河南省南阳市
等 级:论坛游侠
帖 子:156
专家分:162
注 册:2012-12-29
收藏
得分:10 
所谓鞍点就是二维数组中的元素在所在的行上最大,在该列上最小,但是你输入的数有可能是你随意输的,也可能没有鞍点。请看下面代码:
#include<stdio.h>
#define M 5
#define N 4//数组为4行5列
int main()
{
int i,j,k,a[N][M],max,maxj,flag;
printf("请输入数组:\n");
for(i=0;i<N;i++)
for(j=0;j<M;j++)
scanf("%d",&a[i][j]);
for(i=0;i<N;j++)
{max=a[i][0];//开始时假设a[i][0]最大
maxj=0;//将列号0付给maxj保存
for(j=0;j<M;j++)//找出第i行中的最大数
if(a[i][j]>max)
{max=a[i][j];//将本行的最大数存放在max中
maxj=j;//将最大的数所在的列号存放在maxj中
}
flag=1;//先假设是鞍点
for(k=0;k<N;k++)
if(max>a[k][maxj])//将最大数和同列元素比较
{flag=0;//如果max不是同列最小的,则不是鞍点
continue;
}
if(flag)//如果是鞍点
{printf("a[%d][%d]=%d\n",i,maxj,max);//输出鞍点所在的行列号以及值
break;
}
}
if(!flag)//表示鞍点不存在!

printf("没有鞍点!\n");
return 0;
}
由于截图我弄不好,没传上去。就把他们敲出来吧。
运行结果:
请输入数组:
1 2 3 4 11
2 4 6 8 12
3 6 9 10 15
4 8 12 16 7
没有鞍点!
上面是无鞍点的,来一个有鞍点的:
运行结果;
请输入数组:
1 2 3 4 5
2 4 6 8 10
3 6 9 12 15
4 8 12 16 20
a[0][4]=5
谁有更加简便的算法,请传上来,让俺借鉴一下!还望大神指点
2013-01-01 09:39
张学平
Rank: 2
等 级:论坛游民
帖 子:26
专家分:13
注 册:2013-11-20
收藏
得分:0 
回复 6楼 尹金魁2031
借用了下楼上的代码,在visual c++6.0里面能用;在turbo c 2.0里边报错,为啥?
2013-11-22 08:50
快速回复:求二维数组的鞍点,求助!
数据加载中...
 
   



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

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