既然要在一个二维数组中找数,那么就要将需要寻找的数字与二维数组中的数字进行比较,又因为该二维数组是有序排列的,所以我们为了在这个二维数组中寻找一个数,一定要知道在比较完大小之后,下来需要同哪个数作比较.
如果我们先同左上角的数比较,假如需要寻找的数比这个数大,那该往右边走还是往下边走,显然可选择的路变为了两条.
基于这个思路考虑,我们可以选择的出发点就只剩下了右上角和左下角.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main(){
int arr[4][4] = { 1, 2, 8, 9,
2, 4, 9, 12,
4, 7, 10, 13,
6, 8, 11, 15 };
int n;
int row = 3;
int col = 0;
int leap = 1;
printf("请输入您想要查找的数: ");
scanf("%d", &n);
while (row >= 0 && col <= 3){
if (n > arr[row][col]){
++col;
}
else if(n < arr[row][col]){
--row;
}
else {
printf("找到了!\n");
leap = 0;
break;
}
}
if (leap){
printf("没找到!\n");
}
system("pause");
return 0;
}
将该功能放在一个函数当中,此时最需要注意的就是二维数组的传参问题,我们可以直接将数组名作为实参,但形参就要注意一下了,这里我们的形参是一个数组指针,指向一个长度为4的数组(在这个二维数组中,其实就是四个一维数组,每一个一维数组又包含有四个元素).
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
//将该功能放在一个函数当中
int FindNum(int (*arr)[4], int to_find){
int row = 3;
int col = 0;
while (row >= 0 && col <= 3){
if (to_find > arr[row][col]){
++col;
}
else if (to_find < arr[row][col]){
--row;
}
else {
return 1;
}
}
return 0;
}
int main(){
int arr[4][4] = { 1, 2, 8, 9,
2, 4, 9, 12,
4, 7, 10, 13,
6, 8, 11, 15 };
int n;
printf("请输入您想要查找的数: ");
scanf("%d", &n);
if (FindNum(arr, n)){
printf("找到了!\n");
}
else {
printf("没找到!\n");
}
system("pause");
return 0;
}