剑指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;}

原创粉丝点击