剑指offer-29:顺时针打印矩阵

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

解题思路为:

(1)可以把矩阵看成若干个圈,循环打印每个圈即可(如图1)。假设对于一个行数是rows,列数是columns的一个矩阵,每次选取矩阵中的左上角(startX,startY)为每一圈的开始。对于一个5x5或6x6的矩阵,都能发现最后一圈只有一个数字,其坐标为(2,2),并且5>2x2或6>2x2。因此循环继续的条件是columns>2xstartX或rows>2xstartY。

(2)对于打印每一圈矩阵,可以分为四步(如图2):第一步从左往右打印一行,第二步从上到下打印一列,第三步从右往左打印一行,第四部从下往上打印一列。对于第一步打印不需要条件判断,每一圈矩阵至少需要这一步打印。对于第二步条件前提是终止行号大于起始行号。对于第三步打印,要求终止行号大于起始行号,终于列号大于起始行号。第四步的前提条件是终止行号比于起始行号大2,终于列号大于起始行号。
在这里插入图片描述
在这里插入图片描述
代码如下:

#include<stdio.h>
#include<stdlib.h>
void PrintCircle(int **number, int columns, int rows, int start)
{
	int endX = columns- 1 - start;
	int endY = rows - 1 - start;

	//从左到右
	for (int i = start; i <= endX; ++i)
	{
		int numbers = number[start][i];
		printf("%d ", numbers);
	}

	//从上到下
	if (endY > start)
	{
		for (int i = start + 1; i <= endY; --i)
		{
			int numbers = number[i][endX];
			printf("%d ", numbers);
		}
	}

	//从右到左打一行
	if (endY > start && endX> start)
	{
		for (int i = endX - 1; i >= start; --i)
		{
			{
				int numbers = number[endY][i];
				printf("%d ", numbers);
			}
		}
	}

	//从下到上打印一列
	if (endY - 1 > start && endX> start)
	{
		for (int i = endY - 1; i >=start+1; --i)
		{
			int numbers = number[i][start];
			printf("%d ", numbers);
		}
	}
}


void  printMatrix(int **number,int columns,int rows)
{
	if (number == NULL || columns <= 0 || rows <= 0)
		return;
	int start = 0;
	
	while (columns > start * 2 && rows > start * 2)
	{
		PrintCircle(number, columns, rows, start);
		++start;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值