今天分享的是杨氏矩阵,题目不是特别难,但是是一道比较考验你对杨氏矩阵的理解,要是你不知道杨氏矩阵的话,那你这道题目就无从下手
杨氏矩阵我们可以这样理解,首先矩阵二字证明他是一个长方形型或者正方形的数组,然后从上往下和从左往右的数值是递增的,我们下面看这样的一张图片,大家就可以明白了
通过这个图,我们可以观察到他的每列和每行都是递增的,这就是杨氏矩阵,那么我们要实现一个代码来查找他的位置,首先我们要想到数组,而且必须是一个二维数组,这样才能存放我们的数据,那么比如我们要找5这个数,他在这个表中的位置是坐标(3,3),那我们就要实现这样的一个代码来完成找到这个数,并且知道这个数的位置所在,若没有这个数,则输出找不到,这个逻辑其实和我们之前写过的三子棋比较相似。
int find_num(int arr[ROW][COl], int row, int col, int k) { int x = 0; int y = col - 1; while (x < row && y >= 0) { if (arr[x][y] == k) { printf("下标为: %d %d\n", x, y); return 1; } else if (arr[x][y] > k) y--; else if (arr[x][y] < k) x++; } return 0; } • 1 • 2 • 3 • 4 • 5 • 6 • 7 • 8 • 9 • 10 • 11 • 12 • 13 • 14 • 15 • 16 • 17 • 18
上面是我们的代码,我们的思路是这样的,我们从右上角开始,如果我们对应的位置比我们要找的数大的时候,那我们向左移,反之向下移,若找到则退出,第一次没找到就继续找,一直循环,直到我们找到这个数为止,若在我们的条件里还没找到,那我们退出循环
下面我们可以用一个main函数来测试我们上面的代码
#include <stdio.h> int find_num(int arr[3][3], int row, int col, int k) { int x = 0; int y = col - 1; while (x < row && y >= 0) { if (arr[x][y] == k) { printf("下标为: %d %d\n", x, y); return 1; } else if (arr[x][y] > k) y--; else if (arr[x][y] < k) x++; } return 0; } int main() { int arr[3][3] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; int ret = find_num(arr, 3, 3, 7); if (ret == 1) printf("找到了\n"); else printf("找不到\n"); return 0; }
这里我们数组举例是不重复的数字,如果是上面图案中的也行,不过位置可能不同,如果有相同的数字的话,是先出现在靠右的
今天的题目分享就到这,谢谢大家!!!