zoukankan      html  css  js  c++  java
  • 《剑指offer》第二十九题(顺时针打印矩阵)

    // 面试题29:顺时针打印矩阵
    // 题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
    
    #include <iostream>
    
    void PrintMatrixInCircle(int** numbers, int columns, int rows, int start);
    void printNumber(int number);
    
    void PrintMatrixClockwisely(int** numbers, int columns, int rows)
    {
        if (numbers == nullptr || columns <= 0 || rows <= 0)//鲁棒性
            return;
    
        int start = 0;
    
        while (columns > start * 2 && rows > start * 2)//结束循环条件
        {
            PrintMatrixInCircle(numbers, columns, rows, start);
    
            ++start;
        }
    }
    
    void PrintMatrixInCircle(int** numbers, int columns, int rows, 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)//所以这里start + 1
            {
                int number = numbers[i][endX];
                printNumber(number);
            }
        }
    
        // 从右到左打印一行
        if (start < endX && start < endY)//在有上述那一列情况下,还有从左到右的点
        {
            for (int i = endX - 1; i >= start; --i)//由于最右的点让上述那列打印了,于是开头是endX - 1
            {
                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);
            }
        }
    }
    
    void printNumber(int number)
    {
        printf("%d	", number);
    }
    
    // ====================测试代码====================
    void Test(int columns, int rows)
    {
        printf("Test Begin: %d columns, %d rows.
    ", columns, rows);
    
        if (columns < 1 || rows < 1)
            return;
    
        int** numbers = new int*[rows];//建立一个二维矩阵第一步
        for (int i = 0; i < rows; ++i)
        {
            numbers[i] = new int[columns];//建立一个二维矩阵第二步
            for (int j = 0; j < columns; ++j)
            {
                numbers[i][j] = i * columns + j + 1;
            }
        }
    
        PrintMatrixClockwisely(numbers, columns, rows);
        printf("
    ");
    
        for (int i = 0; i < rows; ++i)
            delete[](int*)numbers[i];//还得循环删除
    
        delete[] numbers;//然后还得删除!
    }
    
    int main(int argc, char* argv[])
    {
        /*
        1
        */
        Test(1, 1);
    
        /*
        1    2
        3    4
        */
        Test(2, 2);
    
        /*
        1    2    3    4
        5    6    7    8
        9    10   11   12
        13   14   15   16
        */
        Test(4, 4);
    
        /*
        1    2    3    4    5
        6    7    8    9    10
        11   12   13   14   15
        16   17   18   19   20
        21   22   23   24   25
        */
        Test(5, 5);
    
        /*
        1
        2
        3
        4
        5
        */
        Test(1, 5);
    
        /*
        1    2
        3    4
        5    6
        7    8
        9    10
        */
        Test(2, 5);
    
        /*
        1    2    3
        4    5    6
        7    8    9
        10   11   12
        13   14   15
        */
        Test(3, 5);
    
        /*
        1    2    3    4
        5    6    7    8
        9    10   11   12
        13   14   15   16
        17   18   19   20
        */
        Test(4, 5);
    
        /*
        1    2    3    4    5
        */
        Test(5, 1);
    
        /*
        1    2    3    4    5
        6    7    8    9    10
        */
        Test(5, 2);
    
        /*
        1    2    3    4    5
        6    7    8    9    10
        11   12   13   14    15
        */
        Test(5, 3);
    
        /*
        1    2    3    4    5
        6    7    8    9    10
        11   12   13   14   15
        16   17   18   19   20
        */
        Test(5, 4);
        system("pause");
        return 0;
    }
  • 相关阅读:
    Oracle 推出 ODAC for Entity Framework 和 LINQ to Entities Beta版
    Entity Framework Feature CTP 5系列文章
    MonoDroid相关资源
    MSDN杂志上的Windows Phone相关文章
    微软学Android Market推出 Web Windows Phone Marketplace
    使用 Visual Studio Agent 2010 进行负载压力测试的安装指南
    MonoMac 1.0正式发布
    Shawn Wildermuth的《Architecting WP7 》系列文章
    使用.NET Mobile API即51Degrees.mobi检测UserAgent
    MongoDB 客户端 MongoVue
  • 原文地址:https://www.cnblogs.com/CJT-blog/p/10491905.html
Copyright © 2011-2022 走看看