面试题20:顺时针打印矩阵
题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
例如:如果输入如下矩阵:
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。
题目分析
解决这个问题的关键在于先要形成清晰的思路,并把复杂的问题分解成若干个简单的问题。主要考查应聘者的思维能力,能很快地找出其规律并写出完整的代码。当问题比较抽象时不容易理解时,可以试着画几个图形帮助理解,这样往往能更快地找到思路。
分析循环结束的条件,实现函数printMatrixClockwisely;接着我们考虑如何打印一圈的功能,即如何实现printMatrixInCircle,我们要仔细分析打印每一步的前提条件,打印矩阵最里边一圈可能只需要三步、两步甚至一步。
代码实现
#include <stdio.h> void printMatrixInCircle(int** numbers, int columns, int rows, int start); void printMatrixClockwisely(int** numbers, int columns, int rows) { if (numbers == NULL || columns <= 0 || rows <= 0) return; int start = 0; while (start * 2 < columns && start * 2 < rows) { 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]; printf("%d ",number); } // 从上到下打印一列 if (start < endY) { for (int i = start + 1; i <= endY; ++i) { int number = numbers[i][endX]; printf("%d ", number); } } // 从右到左打印一行 if (start < endX && start < endY) { for (int i = endX - 1; i >= start; --i) { int number = numbers[endY][i]; printf("%d ", number); } } // 从下到上打印一列 if (start < endY && start + 1 < endY) { for (int i = endY - 1; i >= start + 1; --i) { int number = numbers[i][start]; printf("%d ", number); } } } int main() { int** a = new int*[4]; for (int k = 0; k < 4; k++) { a[k] = new int[4]; } // int a[4][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }; int index = 1; for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { a[i][j] = index++; } } printMatrixClockwisely(a, 4, 4); getchar(); return 0; }