找出一个二维数组的鞍点

求问,人傻了QAQ,为什么下面的程序运行结果会是不属于数组里的数字2

#include <stdio.h>

int main()
{
int a[][2]={1,3,7,8};
    int i,k,max[2],h,t;
    
    for(k=0;k<2;k++)
    {
        for(max[k]=a[k][0],i=1;i<2;i++)
        {
            if(max[k]<a[k][i])
            {
                max[k]=a[k][i];
            }
        
        }
        
        for(t=0;t<2;t++)
        {
            if(max[k]<=a[k][t])
            h++;    
        }
        
        if(h==2)
        {
            printf("%d",a[t][k]);
        }
}
        return 0;
    
    }

#include <stdio.h>

int main()
{
    int a[][2] = { {1,3}, {7,8} };
    int i, j, max, min, row, col, is_saddle;

    for (i = 0; i < 2; i++)
    {
        max = a[i][0]; // 假设每行的最大值为该行的第一个元素
        col = 0;

        // 寻找第 i 行的最大值和列坐标
        for (j = 1; j < 2; j++)
        {
            if (max < a[i][j])
            {
                max = a[i][j];
                col = j;
            }
        }

        // 判断是否为鞍点
        is_saddle = 1;
        min = a[0][col]; // 假设每列的最小值为该列的第一个元素
        row = 0;

        for (j = 1; j < 2; j++)
        {
            if (min > a[j][col])
            {
                min = a[j][col];
                row = j;
            }
        }

        if (max == min && row == i)
        {
            printf("鞍点为:%d", a[i][col]);
            return 0;
        }
    }

    printf("不存在鞍点");
    return 0;
}
  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7472423
  • 你也可以参考下这篇文章:最小生成树系列QAQ
  • 除此之外, 这篇博客: 数据结构学习,链队列中的 返回队列Q中的元素个数 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • int QueueLength_LQ(LQueue Q)
    {
    	LQNode* p;
    	p = Q.front;
    	int sum = 0;
    	while (p != NULL)
    	{
    		sum++;
    		p = p->next;
    	}
    	return sum;
    }
  • 您还可以看一下 邵发老师的QQ机器人--基于酷Q开发7精讲课程中的 自己代码与框架代码的分离小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    示例代码:

    #include<stdio.h>
    
    int main()
    {
        int a[4][5]; 
        int i,j,k,m=0,n=0,max=0,min=0,temp=0;
    
        printf("输入数组的值:\n");
        for(i=0;i<4;i++)//键盘输入二维数组的值 
            for(j=0;j<5;j++)
                scanf("%d",&a[i][j]);
    
        for(i=0;i<4;i++)                                  
        {
            for(j=0;j<5;j++)//获得i行最大值 
                if(a[i][m]<a[i][j])
                { 
                    m=j;
                    a[i][m]=a[i][j];
                }
    
            max=a[i][m];//存储该行最大值所在的列为m                                     
            min=a[0][m];//存储m列的最小值 
            for(k=0;k<4;k++)
                if(a[k][m]<min)//获得该列最小值 
                {
                    min=a[k][m];
                    n=k;
                }                                                
            if(max==min){//若相等则有鞍点,循环结束 
                temp=1;
                printf("鞍点为:a[%d][%d]=%d",n,m,a[n][m]);  
                break;
            } 
        }
        if(temp==0)
            printf("该二维数组不存在鞍点!");
    }
    

    问题解答:

    对于二维数组的鞍点查找,可以按照参考资料中的解题流程,对每行进行遍历,先找到每行的最大值,然后再确定该最大值是否是所在列的最小值,若满足,则为鞍点,遍历停止;否则,继续,若遍历完所有行之后依旧未找到,则表示该二维矩阵无鞍点。

    程序中可能存在的问题包括:

    1. 数组下标是否越界:程序中使用的二维数组下标为a[4][5],需要保证输入的数字不超出这个范围;
    2. 储存最大值和最小值时是否正确:程序中用max变量储存该行最大值,但在取出该行的最大值后,把它赋值给了a[i][m],这会导致后面的判断失效。正确的做法是用max记录最大值的数值,而不是该数在数组中的下标,同理,对列中的最小值也需要做类似的修改;
    3. 没有处理数组中元素出现相同的情况:如果一行(或一列)中出现多个最大值,并且这些数都是鞍点,程序会输出最后一个最大值所在的位置,而不是所有鞍点的位置。

    完整程序已经修正了上述的问题,可以直接运行使用。