题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排列。请完成这样一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

分析:如输入的二维数组为

                            1 2 8  9

                            2 4 9  12

                            4 7 10 13

                            6 8 11 15

我们可以从右上角开始的那个数字(设为data[x][y])与输入数字(设为d)进行比较,如果

data[x][y]<d,说明当前数字小于给定数字d,我们只能向比当前数字大的那个方向继续查找,于是我们向下走,即x++;

如果data[x][y]>d,说明当前数字大于给定数字d,我们只能向比当前数字小的那个方向继续查找,于是我们向左走,即y--;

如果data[x][y]==d,则我们就找到了与给定数字相等的那个整数,就可以返回了。

代码如下:

#include <stdio.h>

int DoesHave(int (*data)[4],int m,int n,int d)
{
	int ret = 0;
	int x=0,y=n-1;
	if(data == NULL)
		return -1;
	while(x<m && y>=0)
	{
		if(data[x][y] == d)
		{
			ret = 1;
			break;
		}
		else if(data[x][y] < d)
		{
			x++;
		}
		else if(data[x][y] > d)
		{
			y--;
		}
	}

	return ret;
}

int main()
{
	int data[4][4];
	int i,j;
	int ret;
	int d;
	for(i=0;i<4;i++)
		for(j=0;j<4;j++)
		{
			scanf("%d",&data[i][j]);
		}
	printf("请输入你要判断是否存在的整数:");
	scanf("%d",&d);

	ret = DoesHave(data,4,4,d);
	if(ret)
		printf("存在该数%d",d);
	else
		printf("不存在该数%d",d);


	return 0;
}