杨氏矩阵查找

59 阅读1分钟

杨氏矩阵查找

#include <stdio.h>

// 杨氏矩阵寻找
void young_tableau_search(int (*arr)[3], int key, int *r, int *c)
{
    // 杨氏矩阵特点:从左到右变大 从上到下变大
    // 那么能确定两个最值交汇点为矩阵的右上角 为当前行的最大值 当前列的最小值
    // 那么和这个点比较 如果比这个点小 那么目标在这一行中 之后移动的方向为向左 如果比这个点大 移动的方向为向下
    // 每次比较不相等时都能排除一行/列
    int x = 0;
    int y = *c - 1;
    while (x < *r && y >= 0)
    {
        if (arr[x][y] > key)
        {
            y--;
        }
        else if (arr[x][y] < key)
        {
            x++;
        }
        else
        {
            *r = x;
            *c = y;
            return;
        }
    }
    *r = -1;
    *c = -1;
}
int main()
{
    int arr[3][3] = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}};
    int r = 3;
    int c = 3;
    int k = 7;
    young_tableau_search(arr, k, &r, &c);
    if (r == -1 && c == -1)
    {
        printf("cannot find element:%d", k);
    }
    else
    {
        printf("find the element:%d at (%d,%d)", k, r, c);
    }
    return 0;
}