第一种:
思路:
二维数组是从左到右递增,从上到下递增,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>//二维数组传参 bool find(int (*a)[7],int M,int num) { assert(a); int i=M-1; int j=6; if(num<a[0][0]||num>a[i][6]) { return false; } else { while((j>0)&&(i>0)) { if(num==a[i][j]) { return false; } if(num<a[i][j]&&num<a[i-1][j-1]) { int tmp=0; for(;tmp<j;j++) { if(a[i][tmp]==num) { return true; } } tmp=0; for(;tmp<i;tmp++) { if(a[tmp][j]==num) { return true; } } return false; } else { j--; i--; } } if(i==0) { for(int tmp=0;tmp<j;tmp++) { if(a[i][tmp]==num) { return true; } } return false; } if(j=0) { for(int tmp=0;tmp<i;tmp++) { if(a[tmp][i]==num) { return true; } } return false; } } } int main() { int a[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"); return 0; }
第二种:
思路:实现比较简单,建议采用。
从右上角访问,该数组从左到右递增,从上到下递增,a[0][col-1]和num比较,如果num比a[0][col-1]大,则剔除该行,row--,如果num比a[0][col]小,则剔除该列,col--;缩小查找范围。
左下角访问道理一样。
#include<stdio.h> #include<stdlib.h> bool find(int (*a)[7],int row,int num) { int i=0; int col=7; int j=col-1; while(i<row&&j>=0) { if(a[i][j]==num) { return true; } else if(a[i][j]<num) { i++; } else { j--; } } return false; } int main() { int a[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"); return 0; }
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。