查找二维数组的鞍点

简介: 查找二维数组的鞍点

鞍点的定义为:鞍点元素是所在行中值最小的元素,是所在列中值最大的元素。


要解决鞍点问题,我们可以对二维数组进行检索,找出每一行中有最小值的元素,然后找出该元素所在列中的最大元素,比较该列的最大元素的值与该元素的值。


但是,必须考虑到,如果一个看似鞍点,但其所在行列却又元素大小与之相等,则这个“鞍点”不满足定义,所以它不是一个鞍点。


综上,我们先判断行列最值,然后判断行列中是否有多个最值,如果有元素满足:既是行最小值又是列最大值,同时该元素所在行列没有元素大小与之相等,则该点是鞍点。


#include "stdio.h"
#define V_ONE 3
#define V_TWO 3
int main(void)
{
    int a[V_ONE][V_TWO] = {};
    int i = 0, j = 0, k = 0;
    int row = 0, col = 0;
    int is_anExist = 0;
    int *c_max, *r_min;
    //输入数组元素
    for (i = 0; i<V_ONE; i++)
    {
        printf("请输入第%d行元素\n", i + 1);
        for (j = 0; j<V_TWO; j++)
        {
            scanf_s("%d", &a[i][j]);
        }
    }
    //查找鞍点
    for (i = 0; i < V_ONE; i++)
    {
        //将行最小值和列最大值都初始化为每一行第一个值
        r_min = &a[i][0];
        c_max = &a[0][0];
        //查找行最小值,并将指针指向行最小值,记录列
        for (j = 1; j < V_TWO; j++)
        {
            //初始化 col 的值
            col = 0;
            if (*r_min > a[i][j])
            {
                r_min = &a[i][j];
                c_max = &a[0][j];
                col = j;
            }
        }
        //如果行最小值有多个,则将col记录为-1
        for (j = 0; j < V_TWO; j++)
        {
            if (*r_min == a[i][j] && j != col)
                col = -1;
        }
        //查找列最大值,并将指针指向列最大值,记录行
        for (k = 1; k < V_ONE; k++)
        {
            //初始化row的值
            row = 0;
            if (*c_max < *(c_max + V_TWO))
            {
                c_max = c_max + V_TWO;
                row = k;
            }
        }
        //如果列最大值有多个,这将row记录为-1
        for (k = 0; k < V_ONE; k++)
        {
            if (*c_max == a[k][col] && col != -1 && k != row)
                row = -1;
        }
        //若行最小值和列最大值是同一个元素且该元素所在行列没有与之等大的元素,则该元素是鞍点,输出鞍点
        if (*r_min == *c_max && row != -1 && col != -1)
        {
            printf("鞍点A(%d, %d)的值为:%d\n", row + 1, col + 1, *r_min);
            is_anExist = 1;
        }
    }
    if (is_anExist == 0)
        printf("鞍点不存在!\n");
    return 0;
}
相关文章
|
6月前
|
算法 测试技术 C#
【动态规划】【数论】【区间合并】3041. 修改数组后最大化数组中的连续元素数目
【动态规划】【数论】【区间合并】3041. 修改数组后最大化数组中的连续元素数目
|
C语言
LeetCode二维数组例题(原地旋转和对角线遍历)-c语言
LeetCode二维数组例题(原地旋转和对角线遍历)-c语言
126 0
|
6月前
|
存储 算法 Java
【算法训练-数组 二】【元素组合】两数之和、三数之和
【算法训练-数组 二】【元素组合】两数之和、三数之和
52 0
|
6月前
|
算法 程序员 索引
【算法训练-二分查找 一】【基本二分】二分查找、在排序数组中查找元素的第一个和最后一个位置
【算法训练-二分查找 一】【基本二分】二分查找、在排序数组中查找元素的第一个和最后一个位置
56 0
|
11月前
|
人工智能 算法 C++
C++ 二分查找算法:山脉数组中查找目标值
C++ 二分查找算法:山脉数组中查找目标值
剑指offer-3.二维数组的查找
剑指offer-3.二维数组的查找
26 0
|
存储 算法 编译器
学C的第十二天【深入了解数组:一维和二维数组的创建和初始化;一维和二维数组的使用;一维和二维数组在内存中的存储;数组越界;数组作为函数参数;冒泡排序(对数组名的理解)】-2
5.二维数组的使用 操作符 [ ] :下标引用操作符,它其实就是数组访问的操作符,使用两个[ ],访问行和列 二维数组的行和列都是从0开始的
|
算法
算法篇之二分查找(第74题探索二维矩阵、第287题寻找重复数)
算法篇之二分查找(第74题探索二维矩阵、第287题寻找重复数)
116 0
|
测试技术 编译器 C语言
二维数组之查找鞍点的有无
二维数组之查找鞍点的有无
80 0