Ch4解决面试题的思路——20:顺时针打印矩阵

来源:互联网 发布:java thread 停止 编辑:程序博客网 时间:2024/05/17 00:56

【Ch4.2】画图让抽象问题形象化

【题目】

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。

例如输入如下矩阵

1 2 3 4

5 6 7 8

9 10 11 12

13 14 15 16

则依次打印出1、2、3、4、8、12、16、15、14、13、9、5、6、7、11、10。

该问题看起来简单,实际解决这个问题,会在代码中包含多个循环,并且还需要判断多个边界条件。

因此解决这个问题的关键在于先要形成清晰的思路,并把复杂的问题分解成若干简单的问题。

【本题考点】

本题主要考查应聘者的思维能力。从外到内顺时针打印矩阵这个过程非常复杂,应聘者如何能很快地找出其规律并写出【完整】的代码,是解决这道题的关键。

当问题比较抽象不容易理解时,可以试着画几个图形帮助理解,这样往往能更快地找到思路。


【代码实现】

// PrintMatrix.cpp : Defines the entry point for the console application.//// 《剑指Offer——名企面试官精讲典型编程题》代码// 著作权所有者:何海涛#include "stdafx.h"void PrintMatrixInCircle(int** numbers, int columns, int rows, int start);void printNumber(int number);void PrintMatrixClockwisely(int** numbers, int columns, int rows){    if(numbers == NULL || 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)        {            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);        }    }}void printNumber(int number){    printf("%d\t", number);}// ====================测试代码====================void Test(int columns, int rows){    printf("Test Begin: %d columns, %d rows.\n", 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("\n");    for(int i = 0; i < rows; ++i)        delete[] (int*)numbers[i];    delete[] numbers;}int _tmain(int argc, _TCHAR* 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);    return 0;}




0 0
原创粉丝点击