-
题目描述:
-
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
-
输入:
-
输入可能包含多个测试样例,对于每个测试案例,
输入的第一行为两个整数m和n(1<=m,n<=1000):代表将要输入的矩阵的行数和列数。
输入的第二行包括一个整数t(1<=t<=1000000):代表要查找的数字。
接下来的m行,每行有n个数,代表题目所给出的m行n列的矩阵(矩阵如题目描述所示,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。
-
输出:
-
对应每个测试案例,
输出”Yes”代表在二维数组中找到了数字t。
输出”No”代表在二维数组中没有找到数字t。
【分析】
#include<stdio.h>
#define N 1001
int Matrix[N][N];
//从右上角开始查
int Find_R(int Matrix[N][N],int m,int n,int t){
//从矩阵的右上角查起
int row = 0;
int col = n - 1;
while(row < m && col >= 0){
int number = Matrix[row][col];
//如果该数字等于要查找的数据,查找过程结束
if(number == t){
return 1;
}
//如果该数字小于要查找的数据,查找的数据肯定在该数据的下方,即剔除这个数据所在的行
else if(number < t){
row++;
}
//如果该数字大于要查找的数据,查找的数据肯定在该数据的左方,即剔除这个数据所在的列
else{
col--;
}
}
return 0;
}
int Find_L(int Matrix[N][N],int m,int n,int t){
//从矩阵的左下角查起
int row = m - 1;
int col = 0;
while(row >= 0 && col < n){
int number = Matrix[row][col];
//如果该数字等于要查找的数据,查找过程结束
if(number == t){
return 1;
}
//如果该数字小于要查找的数据,查找的数据肯定在该数据的右方,即剔除这个数据所在的列
else if(number < t){
col++;
}
//如果该数字大于要查找的数据,查找的数据肯定在该数据的上方,即剔除这个数据所在的行
else{
row--;
}
}
return 0;
}
int main(){
int m,n,t,i,j;
while(scanf("%d %d",&m,&n) != EOF){
scanf("%d",&t);
//输入矩阵
for(i = 0;i < m;i++){
for(j = 0;j < n;j++){
scanf("%d",&Matrix[i][j]);
}
}
//查找数据
int result = Find_L(Matrix,m,n,t);
if(result == 1){
printf("Yes\n");
}
else{
printf("No\n");
}
}
return 0;
}
【第二种方法】
此题考查的主要是第一种方法的解题思路。
#include<stdio.h>
int main()
{
int i,j,m,n,t,number,flag;
while (scanf("%d %d",&m, &n) != EOF)
{
flag = 0;
scanf("%d",&t);
for(i = 0; i < m; i++)
for(j = 0; j < n; j++)
{
scanf("%d",&number);
if(t == number)
{
flag = 1;
}
}
if(flag == 1)
{
printf("Yes\n");
}
else
{
printf("No\n");
}
}
return 0;
}