剑指offer面试题20顺时针打印矩阵
来源:互联网 发布:开淘宝怎么交保证金 编辑:程序博客网 时间:2024/05/16 14:55
/*这个题早就做过了 但每次记不住顺时针打印矩形。就找规律模拟的打印就行了把矩形看成若干个圈组成的 主要是分析 每次打印一圈*/#include<iostream>#include<cstdio>#include<cstring>using namespace std;void InitMap(int **map,int n,int m){ int k=1; for(int i=0;i<n;++i) for(int j=0;j<m;++j) map[i][j]=k++;}void showMap(int ** map,int n,int m){ for(int i=0;i<n;++i) { for(int j=0;j<m;++j) printf("%d\t",map[i][j]); printf("\n"); } printf("\n");}//打印一共分四步分,第一步一定会打印之后三步都有条件void PrintMatrixInCircle(int ** map,int n,int m,int start){ int endx=n-start-1; int endy=m-start-1; //打印第一步 从左到右的那一行 for(int i=start;i<=endy;++i)//这里写出bug了 写成endx了 想打印一行 是以右边列端点 printf("%d ",map[start][i]); //超过两行的话 打印第二步 从上到下 if(start<endx) { for(int i=start+1;i<=endx;++i) printf("%d ",map[i][endy]); } //至少两行两列 从右往左打印下面那行 if(start<endx&& start<endy) { for(int i=endy-1;i>=start;--i) printf("%d ",map[endx][i]); } //至少两行三列才打印第四步。 if(start<endx && start <endy-1) { for(int i=endx-1;i>=start+1;--i) printf("%d ",map[i][start]); }}//这个函数就是把矩阵拆分成圈。每个圈再调用打印这个圈的函数//发现每个圈的左上角分别是(0,0)(1,1),(2,2) 等..//并且。start*2<n 和start* 2<m 都必须小于 对应行数和列数void PrintMatirxClockWisely(int ** map,int n,int m){ if(map==NULL || n<1 || m<1) return ; int start=0; while(start*2 < n && start * 2< m) { PrintMatrixInCircle(map,n,m,start); ++start; }}int main(){ int ** map=new int*[4];//注意C++new一个二维数组的方法! 这里很重要啊。以前不会定义int ** =new int*[4]就是new4个一维数组的指针 for(int i=0;i<4;++i) map[i]=new int[4];//再对每个new一维数组 InitMap(map,4,4); showMap(map,4,4); PrintMatirxClockWisely(map,4,4); cout<<endl; /* 1 */ int ** map2=new int*[1]; map2[0]=new int[1]; map2[0][0]=1; PrintMatirxClockWisely(map2,1,1); cout<<endl; /* 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 */ int ** map3=new int *[5]; for(int i=0;i<5;++i) map3[i]=new int[3]; int tmp=1; for(int i=0;i<5;++i) { for(int j=0;j<3;++j) map3[i][j]=tmp++; } showMap(map3,5,3); PrintMatirxClockWisely(map3,5,3); return 0;}