剑指Offer系列---(22)顺时针打印矩阵

来源:互联网 发布:数控车床编程培训教程 编辑:程序博客网 时间:2024/05/29 13:59

1.题目描述:
输入一个矩阵,按照从外到里以顺时针的顺序依次打印出每一个数字。
2.分析:
1)循环继续的条件是:columns>startX*2并且rows>startY*2。
2)把打印一圈分为四步:第一步从左到右打印一行,第二步从上到下打印一列,第三步从右到左打印一行,第四步从下到上打印一列。
3)最后一圈有可能退化成只有一行、只有一列,甚至只有一个数字。第二步的前提条件是终止行号大于起始行号。第三步打印的前提条件为至少有两行两列。第四步的前提条件是至少有三行两列。
3.源代码:

#include <iostream>using namespace std;void printNumber(int a){    cout<<a<<" ";}void PrintMatrixInCircle(int** numbers,int rows,int columns,int start){    int endX = columns - 1 - start;    int endY = rows - 1 - start;        //从左到右打印一行    for(int i=start;i<=endX;i++)    {        int number = numbers[start][i];        printNumber(number);    }    //从上到下打印一列    if(start<endY)    {        for(int i=start+1;i<=endY;i++)        {            int number = numbers[i][endX];            printNumber(number);        }    }    //从右到左打印一行    if(start<endX && start<endY)    {        for(int i = endX-1;i>=start;i--)        {            int number = numbers[endY][i];            printNumber(number);        }    }    //从下到上打印一列    if(start<endX && start<endY-1)    {        for(int i=endY-1;i>=start+1;i--)        {            int number = numbers[i][start];            printNumber(number);        }    }}////顺时针打印矩阵,行数为rows,列数为columnsvoid PrintMatrixClockwisely(int** numbers,int rows,int columns){    if(numbers == NULL || columns <= 0 || rows <= 0)        return;    int start = 0;    while(columns > (start * 2) && rows > (start * 2))    {        PrintMatrixInCircle(numbers,rows,columns,start);        ++start;    }}int main(int argc,char *argv[]){        int numbers1[4][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};    int **p1 = new int*[4];    for(int i=0;i<4;i++)    {        p1[i] = numbers1[i];    }    PrintMatrixClockwisely(p1,4,4);    cout<<endl;        int numbers2[1][4]={{1,2,3,4}};    int **p2 = new int*[1];    for(int i=0;i<1;i++)    {        p2[i] = numbers2[i];    }    PrintMatrixClockwisely(p2,1,4);    cout<<endl;        int numbers3[4][1]={{1},{2},{3},{4}};    int **p3 = new int*[4];    for(int i=0;i<4;i++)    {        p3[i] = numbers3[i];    }    PrintMatrixClockwisely(p3,4,1);    cout<<endl;        int numbers4[2][5]={1,2,3,4,5,6,7,8,9,10};    int **p4 = new int*[2];    for(int i=0;i<2;i++)    {        p4[i] = numbers4[i];    }    PrintMatrixClockwisely(p4,2,5);    cout<<endl;}

4.运行效果:

1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10 1 2 3 4 1 2 3 4 1 2 3 4 5 10 9 8 7 6 Program ended with exit code: 0

0 0
原创粉丝点击