这题只能从左下角或者右上角的顶点开始查找,如果是左上角,它的右边和下面的点的值都比它大,我们并不知道往哪边走,右下角的点也一样
#include <iostream>
void init(int (*a)[3], int r, int c) {
//参数 int (*a)[3] 表示一个指向包含3个整数的数组的指针
// 初始化数组
a[0][0]=1,a[0][1]=5,a[0][2]=25;
a[1][0]=3,a[1][1]=10,a[1][2]=36;
a[2][0]=8,a[2][1]=12,a[2][2]=37;
}
void print(int (*a)[3],int r,int c){
for(int i=0;i<c;i++)
{
for(int j=0;j<c;j++)
printf("%4d",a[i][j]);
puts("");
}
}
//从右上角开始找
bool is_exit(int (*a)[3],int r,int c,int target)
{
int i=0,j=c-1;
while(i<r&&j>=0){
if(a[i][j]==target) return true;
else if(a[i][j]<target)i=i+1;
else j--;
}
return false;
}
//从左下角开始找
bool is_exit2(int (*a)[3],int r,int c,int target)
{
int i=r-1,j=0;
while(i>=0&&j<c){
if(a[i][j]==target)return true;
else if(a[i][j]<target)j++;
else i--;
}
return false;
}
int main() {
int a[3][3];
init(a, 3, 3);
print(a,3,3);
if(is_exit(a,3,3,5)) printf(" 5 is exited\n");
else printf("5 is not exited\n");
if(is_exit(a,3,3,9)) printf(" 9 is exited\n");
else printf("9 is not exited\n");
if(is_exit2(a,3,3,37)) printf(" 37 is exited\n");
else printf("37 is not exited\n");
if(is_exit2(a,3,3,14)) printf(" 14 is exited\n");
else printf("14 is not exited\n");
return 0;
}