吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 804|回复: 13
收起左侧

[求助] 求鞍点 C 程序 二维数组

[复制链接]
18131431963 发表于 2021-10-24 16:42
#include <stdio.h>
#define M 10
#define N 10
int main()
{
        int a[M][N],b[N];
        int i,j,max,min,m,n,k,s,count=0;
    printf("行:");
    scanf("%d",&m);
    printf("列:");
        scanf("%d",&n);
        for(i=0;i<m;i++)
    {
       printf("第%d行\n",i+1);
           
                for(j=0;j<n;j++)
                 {
                           printf("第%d行第%d个元素:",i+1,j+1);
                          scanf("%d",&a[j]);
                          }
                }
                for(i=0;i<m;i++)
                {
                   for(j=0;j<n;j++)       
                   printf("%5d",a[j]);
                   printf("\n");
                }
        for(j=0;j<m;j++)
        {
                max=a[j][0];
                for(i=0;i<n;i++)
                if(a[j]>max)
                max=a[j];
        s=0;
        for(i=0;i<n;i++)
            if(max==a[j])
        {
                b=i;
                s++;
        }
        min=max;
        for(i=0;i<s;i++)
        {
                for(k=0;k<m;k++)
                if(min>a[k][b])break;
                if(k==m)                                                                                 //这行是什么意思?
                {
                        printf("第%d行第%d元素%d",j+1,b+1,a[j][b]);         //这行“j+1,b+1,a[j][b]是什么意思?
                        count++;
                }
        }
        }
        if(count==0)
            printf("没有鞍点\n");       
                       
        return 0;
}

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

layuai 发表于 2021-10-24 22:37
你这个编辑格式看着好难受
vtor 发表于 2021-10-25 08:58
我看到了你输入数据又输出,然后找到了每一行中最大的数值
好像然后找行中最大值的是不是其所在列的最大值。是吧
 楼主| 18131431963 发表于 2021-10-27 10:37
vtor 发表于 2021-10-25 08:58
我看到了你输入数据又输出,然后找到了每一行中最大的数值
好像然后找行中最大值的是不是其所在列的最大值 ...

行的最大值,列的最小值!有些不明白!
 楼主| 18131431963 发表于 2021-10-27 10:38
layuai 发表于 2021-10-24 22:37
你这个编辑格式看着好难受

系统自己弄的!真是难受!
 楼主| 18131431963 发表于 2021-10-27 10:51
#include <stdio.h>
#define M 10
#define N 10
int main()
{
        int a[M][N],b[N];
        int i,j,max,min,m,n,k,s,count=0;
    printf("行:");
    scanf("%d",&m);
    printf("列:");
        scanf("%d",&n);
        for(i=0;i<m;i++)
    {
       printf("第%d行\n",i+1);
           
                for(j=0;j<n;j++)
                 {
                           printf("第%d行第%d个元素:",i+1,j+1);
                          scanf("%d",&a[i][j]);
                          }
                }
                for(i=0;i<m;i++)
                {
                   for(j=0;j<n;j++)       
                   printf("%5d",a[i][j]);
                   printf("\n");
                }
        for(j=0;j<m;j++)
        {
                max=a[j][0];
                for(i=0;i<n;i++)
                if(a[j][i]>max)
                max=a[j][i];
        s=0;
        for(i=0;i<n;i++)
            if(max==a[j][i])
        {
                b[s]=i;
                s++;
        }
        min=max;
        for(i=0;i<s;i++)
        {
                for(k=0;k<m;k++)
                if(min>a[k][b[i]])break;
                if(k==m)
                {
                        printf("第%d行第%d元素%d",j+1,b[i]+1,a[j][b[i]]);
                        count++;
                }
        }
        }
        if(count==0)
            printf("没有鞍点\n");       
                       
        return 0;
}
 楼主| 18131431963 发表于 2021-10-27 10:52
18131431963 发表于 2021-10-27 10:51
#include  
#define M 10
#define N 10

这是正常的,就是不太明白这个程序的后部分!
vtor 发表于 2021-10-27 14:14
[C] 纯文本查看 复制代码
#include <stdio.h>
#define M 10
#define N 10
// 找鞍点,行上最大值,且为列上最小值
// 搜了一下代码,从某呼上来的,如此变量命名,也好意思上传?
int main()
{
	int a[M][N],b[N];
	int i,j,max,min,m,n,k,s,count=0;
	printf("行:");
	scanf("%d",&m);
	printf("列:");
	scanf("%d",&n);
	// 输入数据
	for(i=0;i<m;i++)
	{
		printf("第%d行\n",i+1);

		for(j=0;j<n;j++)
		{
			printf("第%d行第%d个元素:",i+1,j+1);
			scanf("%d",&a[i][j]);
		}
	}
	// 打印数据
	for(i=0;i<m;i++)
	{
		for(j=0;j<n;j++)       
			printf("%5d",a[i][j]);
		printf("\n");
	}

	// 寻找鞍点(先按列进行查找)
	for(j=0;j<m;j++)
	{
		// max用来存储当前行的最大值
		max=a[j][0];
		for(i=0;i<n;i++)
			if(a[j][i]>max)
				max=a[j][i];
		// s用来存储第几个鞍点
		s=0;
		for(i=0;i<n;i++)
			if(max==a[j][i])
			{
				// 记录行的最大值,的下标b[s]
				// 那么当前行最大值是a[j][i]
				// 且数值为max
				b[s]=i;
				// 所有行最小值的个数增加
				s++;
			}
			// 切换查找为列的最小值
			min=max;
			// 有多少最小值数字,就比较多少列
			// 并判断这个最大值,是不是当前列的最小值
			for(i=0;i<s;i++)
			{
				// 如果当前列上的数字比最小值
				// 如果当前列有比min还小的数字,说明并非鞍点,所以退出当前列,查找下一列
				for(k=0;k<m;k++)
					if(min>a[k][b[i]])break;
				// 走到这里,说明当前行内没有比min更小的数字
				// 那么这个数字满足行最大,列最小,就是鞍点,并进行打印
				if(k==m)
				{
					printf("第%d行第%d元素%d",j+1,b[i]+1,a[j][b[i]]);
					count++;
				}
			}
	}
	if(count==0)
		printf("没有鞍点\n");       

	return 0;
}

免费评分

参与人数 1吾爱币 +1 收起 理由
18131431963 + 1 谢谢@Thanks!

查看全部评分

vtor 发表于 2021-10-27 14:51
自己写了一个找鞍点的函数,比那个简单多了,你自己好好看看吧
vtor 发表于 2021-10-27 14:52
[C] 纯文本查看 复制代码
void find_saddle2()
{
	int i,j,m,n,i_idx,j_idx,j_max,i_min,i2;
	int a[3][4]={{1, 2, 8, 4},
				{5, 6, 9, 8},
				{19, 10, 11, 12}};
	m = 3;
	n = 4;
	// 遍历行
	for (i = 0; i < m; i++)
	{
		// 遍历行的每个元素,找行最大值
		j_max = a[i][0];
		// 记录最大元素的下标
		j_idx = 0;
		for (j = 0; j< n; j++)
		{
			if (j_max < a[i][j])
			{
				// 记录行最大值下标与行最大值
				j_idx = j;
				j_max = a[i][j_idx];
			}
		}
		// 判断行最大值是不是列最小值
		i_min = a[0][j_idx];
		i_idx = 0;
		for (i2 = 0; i2< m; i2 ++)
		{
			if (a[i2][j_idx] < i_min)
			{
				i_idx = i2;
				i_min = a[i_idx][j_idx];
			}
		}
		if (j_max == i_min)
		{
			printf("鞍点是[%d][%d]=%d\n",i_idx,j_idx,a[i_idx][j_idx]);
		}
	}
}

免费评分

参与人数 1热心值 +1 收起 理由
18131431963 + 1 谢谢@Thanks!

查看全部评分

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 22:26

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表