有一个数字矩阵,矩阵的每行从左到右是递增的,短阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。
例如:矩形(二维数组)
1 2 3
4 5 6
7 8 9
查找里面某个元素的位置
1.方法一
代码展示:
#include <stdio.h>
int find_num(int arr[3][3],int row,int column,int k)
//行:row 列:column
{
int x=0;//行
int y=column-1;//列
while(x<=row-1 && y>=0)
{
if(k<arr[x][y])
{
y--;
}
else if(k>arr[x][y])
{
x++;
}
else
{
return 1;
}
}
return 0;
}
int main()
{
int arr[3][3]={1,2,3,4,5,6,7,8,9};
int k=0;
printf("请输入要寻找的值:");
scanf("%d",&k);
int ret = find_num(arr,3,3,k);
printf("ret=%d\n",ret);//找到返回1,没找到返回0
return 0;
}
运行结果展示:
2.方法二:
代码展示:对比方法一,此方法用结构体返回查找值的位置
#include <stdio.h>
struct Point
{
int x;
int y;
};
struct Point find_num(int arr[3][3],int row,int column,int k)
//行:row 列:column
{
int x=row-1;//行
int y=0;//列
struct Point p ={-1,-1};
while(x >= 0 && y <= column-1)
{
if(k<arr[x][y])
{
x--;
}
else if(k>arr[x][y])
{
y++;
}
else
{
p.x=x;
p.y=y;
return p;
}
}
return p;
}
int main()
{
int arr[3][3]={1,2,3,4,5,6,7,8,9};
int k=0;
printf("请输入寻找的值:");
scanf("%d",&k);
struct Point ret=find_num(arr,3,3,k);
printf("%d %d\n",ret.x,ret.y);
return 0;
}
运行结果展示:
3.方法三:
代码展示: 返回型参数---(指针)
#include <stdio.h>
//返回型参数
int find_num(int arr[3][3],int *px,int *py,int k)//行:row 列:column
{
int x=0;//开始行
int y=*py-1;//开始列
while(x<=*py-1 && y>=0)
{
if(k<arr[x][y])
{
y--;
}
else if(k>arr[x][y])
{
x++;
}
else
{
*px=x;
*py=y;
return 1;
}
}
*px=-1;
*py=-1;
return 0;//都可以判断是否找到k的值
}
int main()
{
int arr[3][3]={1,2,3,4,5,6,7,8,9};
int k=0;
int a=3;//行
int b=3;//列
printf("请输入要寻找的值:");
scanf("%d",&k);
int ret = find_num(arr,&a,&b,k);
//找到返回1,没找到返回0
if(ret == 1)
printf("%d %d\n",a,b);
else
printf("没找到");
return 0;
}
运行结果展示:
4.方法四
代码展示:可通过宏改变矩阵大小
#include <stdio.h>
//宏
#define I 4
#define J 6
//结构体
struct Point
{
int x;
int y;
};
struct Point find_num(int arr[I][J],int row,int column,int k)
//行:row 列:column
{
int x=row-1;//行
int y=0;//列
struct Point p ={-1,-1};
while(x >= 0 && y <= column-1)
{
if(k<arr[x][y])
{
x--;
}
else if(k>arr[x][y])
{
y++;
}
else
{
p.x=x;
p.y=y;
return p;
}
}
return p;
}
int main()
{
int arr[I][J];
int l=0;
int i = 0;
for(i = 0; i < I; i++)
{
int j = 0;
for(j = 0; j < J; j++)
{
l++;
arr[i][j]=l;
printf("%2d ",arr[i][j]);
}
printf("\n");
}
int k=0;
printf("请输入寻找的值:");
scanf("%d",&k);
struct Point ret=find_num(arr,I,J,k);
printf("arr[%d][%d]=%d\n",ret.x,ret.y,k);
return 0;
}
运行结果展示: