面试题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;
}
原文地址:https://www.cnblogs.com/xwz0528/p/4749593.html