标签:
题目
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
问题分析
应当从具体问题入手,通过分析简单具体的例子,发现普遍的规律。
现在假定,我们要从二维数组
1 7 14 21
3 8 15 22
5 9 16 23
7 17 23 24
中检索是否存在数字7。
按照从右上方,列优先的顺序检索该数组。
1. 在检索17的时候,因为21大于17,故可剔除第四列。
2. 在检索14的时候,因为14小于17,故可剔除第一行,相当于更新行号和列号后重新执行而已。则剩下
3 8 15
5 9 16
7 17 23
3. 在检索15的时候,因为15小于17,故可剔除第一行,只剩下
5 9 16
7 17 23
4. 在检索16的时候,因为16小于17,故可剔除第一行,只剩下
7 17 23
5. 在检索到23的时候,因为23大于17,故可剔除第三列,只剩下
7 17
6. 检索到17,返回。
代码实现如下:
#include <stdio.h> #define M 4 #define N 4 int FindNumber(int array[M][N],int rows,int columns,int number) { if(array!=NULL && rows>0 && columns>0) { int col=columns-1,row=0; while(col>=0 && row<rows) { if(array[row][col]>number) { col--; continue; } else if(array[row][col]<number) { row++; continue; } else return 1; } return 0; } else return 0; } int main(void) { int a[M][N]={ {1,7,14,21},{3,8,15,22},{5,9,16,23},{7,17,23,24} }; int num; printf("要测试的数组为:\n"); for(int i=0;i<M;i++) { for(int j=0;j<N;j++) { printf("%d ",a[i][j]); } printf("\n"); } printf("请输入要查找的数:"); while(scanf("%d",&num)) { if(FindNumber(a,M,N,num)) printf("该数存在\n"); else printf("该数不存在\n"); printf("请输入要查找的数:"); } return 0; }
结果如下:
$ ./MyFindNumberInTwoArrays.exe
要测试的数组为:
1 7 14 21
3 8 15 22
5 9 16 23
7 17 23 24
请输入要查找的数:17
该数存在
请输入要查找的数:23
该数存在
请输入要查找的数:22
该数存在
请输入要查找的数:10
该数不存在
请输入要查找的数:6
该数不存在
请输入要查找的数:
标签:
原文地址:http://www.cnblogs.com/longzhongren/p/4338946.html