一、解题思路:
杨氏矩阵是一个每行每列从左往右增加的一个二维数组,由此,我们可知,在每行的最右端的数字是这行最大的,每列最前的那个数是这列最小的,可参看下图
以上就是小陈分析的杨氏矩阵解题思路。
二、代码展示
1.主函数写法:
int main()
{
int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };
int k = 0;
scanf("%d", &k);
int i = 0;//行
int j = 2;//列
int flag = 0;
while (i <= 2 && j >= 0)
{
if (arr[i][j] < k)
{
i++;
}
else if (arr[i][j] > k)
{
j--;
}
else if (arr[i][j] == k)
{
flag = 1;
printf("找到了\n");
break;
}
}
if (flag == 0)
{
printf("找不到\n");
}
return 0;
}
2. 分装函数的写法:
void young_table_search(int arr[3][3], int src,int *px,int *py)
{
//在每一行的最左边开始查找,看最左边的数
//是否是比查找的数小,小就舍弃那一行,跳到第二行的左边开始查找
//当查找到的最左边的数大于查找的数,就在这一排中查找,变动列
int i= 0;
int j = *py-1;
while (i<=*px-1&&j>=0)
{
if (arr[i][j] < src)
{
i++;
}
else if (arr[i][j] > src)
{
j--;
}
else if(arr[i][j] == src)
{
*px = i;
*py = j;
return;
}
}
*px = -1;
*py = -1;
}
int main()
{
int arr[3][3] = { 1,2,3,4,5,6,7,8,9};
int k = 0;
scanf("%d", &k);
int x = 3;
int y = 3;
young_table_search(arr, k,&x,&y);
if (arr[x][y] == k)
{
printf("找到了,下标为:%d %d\n", x, y);
}
if (x == -1 && y == -1)
{
printf("找不到\n");
}
return 0;
}
首先,我们在开始时写一个main函数,创建一个二维数组,在创建一个K,这里的K代表的是我们需要查找的数字, 还是使用我们的scanf函数录入我们需要查找的数字。接下来,创建我们的杨氏矩阵查找函数,把我们所需要的参数传入到我们的函数中,如果后面需要让此函数返回查找数字在矩阵中所在的行与列,我们不妨可以在主函数内定义俩个变量,创建x与Y两个变量,再把两个变量的地址传入函数中(传址和传值的区别,传值是不能改变我们变量在主函数的值,但是传址可以,传址,相当于我们把变量的地址传过去,在变量所给的地址中去寻找变量的初始值去改变,传值只是仅仅重新在函数中开辟一个新的空间来存放,而后期的改变也是在这个空间中改变,但是出了这个函数,这个空间就主动销毁了,主函数中的变量还是没有被改变)这样就能得到查找函数的列和行了(return不能同时返回俩个值,因此我们这里采用了这种写法,来得到我们所需要的坐标)