/*
//杨氏矩阵
有一个二维数组.
数组的每行从左到右是递增的,每列从上到下是递增的.
在这样的数组中查找一个数字是否存在。
时间复杂度小于O(N);
数组:
1 2 3
2 3 4
3 4 5
1 3 4
2 4 5
4 5 6
1 2 3
4 5 6
7 8 9
*/
//思路:
//1.由该矩阵的特点可知,左边元素比右边元素大,
//下边元素比上边元素大;
//2.若以左下角元素为基准,比它大的元素向右找,
//比它小的元素向上找,若找到符合要求的值就跳
//出循环;若直到最右上角也没找到,再没有元素比
//它离原来元素更远了(奇=即不存在符合要求的值);
//3.同样的道理,也可以从右上角元素找起,可以自
//行体会一下.
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
//用户输入要查的值函数
void Input(int* num){
printf("请输入您想要查的数:\n"); //提示用户输入信息
scanf("%d", num); //保存用户输入的信息
}
//从杨氏矩阵中找一个数函数
int find_a_number(int Young_tableaus[3][3],int num){
//从左下角元素找起
int i = 2; //左下角元素的行数
int j = 0; //左下角元素的列数
while (i >= 0 && j < 3){ //当i大于等于0,j小于3是
if (Young_tableaus[i][j] > num){ //若要查数比该元素小
--i; //取其上一个元素
}
if (Young_tableaus[i][j] < num){ //若要查数比该元素大
++j; //取其右边一个元素
}
if (Young_tableaus[i][j] == num){ //若要查数等于该元素
printf("找到了%d\n", Young_tableaus[i][j]); //打印输出信息
return 1;
}
}
printf("抱歉,没找到您要的数.\n"); //打印提示信息
return 0;
}
//主函数
int main(){
int num;
int Young_tableaus[3][3] = {
{1,2,3},
{4,5,6},
{7,8,9}
}; //定义二维数组,并初始化
Input(&num); //调用自定义的输入函数
find_a_number(Young_tableaus,num); //调用在杨氏矩阵中找一个数的函数
system("pause");
return 0;
}