题目:杨氏矩阵

杨氏矩阵的介绍

已知一个2维矩阵,其中的元素每一行从左至右依次增加,每一列从上到下依次增加。即对于矩阵Table有Table[i][j] ≤Table[i][j + 1], Table[i][j] ≤ Table[i + 1][j],我们也称这样的矩阵为杨氏矩阵。

题目:杨氏矩阵_第1张图片

如上图所示

题目描述

有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。

思路分析

例如在下面的表格中,我们假如要找的数字是17,我们可以从左下角开始找,因为21>17,所以我们向上平移一行,12<17,向右平移一列;14<17,向右平移;16<17,继续向右平移;18>17,向上平移,;17=17,于是就找到我们要找的数字了。

那么如何判断要找的元素在不在矩阵当中呢?我们可以这样,只要要找的数字比左上角小,比右下角大,那么该数字一定不在该矩阵当中。

当然我们也可以从右上角开始寻找,方法也是差不多的。

题目:杨氏矩阵_第2张图片

代码展示

#include
#define N 5//行
#define M 5//列
int find_number(int arr[N][M], int key, int* i, int* j)
{
	if (keyarr[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;
}

题目:杨氏矩阵_第3张图片 

 其实这个题有许多种方法可以解决,我只是看了一种比较好理解的方法,例如还有递归解法,分治查找法,定位查找法等。如果你们能看懂的话,可以帮忙点点赞,我还会继续更新更多的题目的

你可能感兴趣的:(矩阵,算法,c语言)