第一种:

思路:

二维数组是从左到右递增,从上到下递增,row为行数,col为列数,a[row-1][col-1]为最大数,如果剔除这一行,这一列,则最大数为a[row-2][col-2],如果要查找的num大于a[row-2][col-2]并且大于a[row-1][col-1],则在该row-1行和col-1列查找,照这样遍历。


这样太麻烦,效率太低,应当舍弃。

#include<stdio.h>#include<stdlib.h>#include<assert.h>//二维数组传参boolfind(int(*a)[7],intM,intnum){assert(a);inti=M-1;intj=6;if(num<a[0][0]||num>a[i][6]){returnfalse;}else{while((j>0)&&(i>0)){if(num==a[i][j]){returnfalse;}if(num<a[i][j]&&num<a[i-1][j-1]){inttmp=0;for(;tmp<j;j++){if(a[i][tmp]==num){returntrue;}}tmp=0;for(;tmp<i;tmp++){if(a[tmp][j]==num){returntrue;}}returnfalse;}else{j--;i--;}}if(i==0){for(inttmp=0;tmp<j;tmp++){if(a[i][tmp]==num){returntrue;}}returnfalse;}if(j=0){for(inttmp=0;tmp<i;tmp++){if(a[tmp][i]==num){returntrue;}}returnfalse;}}}intmain(){inta[4][7]={{1,2,3,4,5,6,7},{3,4,5,6,7,8,9},{5,7,9,11,13,15,17},{7,9,13,15,17,21,23},};printf("%d\n",find(a,4,1));system("pause");return0;}

第二种:

思路:实现比较简单,建议采用。

从右上角访问,该数组从左到右递增,从上到下递增,a[0][col-1]和num比较,如果num比a[0][col-1]大,则剔除该行,row--,如果num比a[0][col]小,则剔除该列,col--;缩小查找范围。


左下角访问道理一样。

#include<stdio.h>#include<stdlib.h>boolfind(int(*a)[7],introw,intnum){inti=0;intcol=7;intj=col-1;while(i<row&&j>=0){if(a[i][j]==num){returntrue;}elseif(a[i][j]<num){i++;}else{j--;}}returnfalse;}intmain(){inta[4][7]={{1,2,3,4,5,6,7},{3,4,5,6,7,8,9},{5,7,9,11,13,15,17},{7,10,13,15,17,21,23},};printf("%d\n",find(a,4,34));system("pause");return0;}