杨氏矩阵的介绍
已知一个2维矩阵,其中的元素每一行从左至右依次增加,每一列从上到下依次增加。即对于矩阵Table有Table[i][j] ≤Table[i][j + 1], Table[i][j] ≤ Table[i + 1][j],我们也称这样的矩阵为杨氏矩阵。
如上图所示
题目描述
有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。
思路分析
例如在下面的表格中,我们假如要找的数字是17,我们可以从左下角开始找,因为21>17,所以我们向上平移一行,12<17,向右平移一列;14<17,向右平移;16<17,继续向右平移;18>17,向上平移,;17=17,于是就找到我们要找的数字了。
那么如何判断要找的元素在不在矩阵当中呢?我们可以这样,只要要找的数字比左上角小,比右下角大,那么该数字一定不在该矩阵当中。
当然我们也可以从右上角开始寻找,方法也是差不多的。
代码展示
#include<stdio.h>
#define N 5//行
#define M 5//列
int find_number(int arr[N][M], int key, int* i, int* j)
{
if (key<arr[0][0] || key>arr[N - 1][M - 1])//若找的数字比左上角还小,比右下角还大,那么该数字不在矩阵中
return 0;
int row = N - 1;//从左下角开始找
int col = 0;
while (row >= 0 && col < M)//在目标矩阵中循环
{
if (key < arr[row][col])//上移
{
row--;
}
else if (key > arr[row][col])//右移
{
col++;
}
else
{
//计算坐标
*i = row + 1;
*j = col + 1;
return 1;
}
}
}
int main()
{
int arr[5][5] = { {1,3,5,7,9},
{2,4,6,8,10},{11,13,15,17,19},
{12,14,16,18,20},{21,23,25,27,29} };
int n = 0;
printf("请输入你要查找的数字:");
while (scanf("%d", &n) != EOF)
{
int i, j = 0;
if (find_number(arr, n, &i, &j))//传的是地址
{
printf("找到了,下标是(%d,%d)\n", i, j);
}
else
printf("该数字不在杨氏矩阵中\n");
printf("请输入你要查找的数字:");
}
return 0;
}
其实这个题有许多种方法可以解决,我只是看了一种比较好理解的方法,例如还有递归解法,分治查找法,定位查找法等。如果你们能看懂的话,可以帮忙点点赞,我还会继续更新更多的题目的