学习笔记24——顺时针打印矩阵

题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
思路:把矩阵看成由若干个顺时针方向的圆组成,用一个循环来打印矩阵,每次打印矩阵中的一个圆。循环继续的条件为columns > startX * 2 并且 rows > startY * 2(令每一圈的左上角为(startY,startX))。接着把打印一圈分为四步:第一步,从左到右打印一行;第二步,从上到下打印一列;第三步,从右到左打印一行;第四步,从下到上打印一列。每一步根据起始坐标(start,start)和终止坐标(endY,endX)用一个循环就能打印出一行或一列。需要注意,打印最后一圈的时候,可能只需要三步、两步或一步。
打印每一步时的前提条件为:

步数前提条件
第一步无前提,因为打印一圈至少有一步
第二步终止行号大于起始行号,即 start < endY
第三步终止行号大于起始行号且终止列号大于起始列号,即 start < endY && start < endX
第四步终止行号比起始行号至少大2且终止列号大于起始列号,即 start < endY - 1 && start < endX

核心代码如下:

void PrintMatrixInCircle(int** numbers, int columns, int rows, int start);

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];
		cout << number << " ";
	}

	//从上到下打印一列
	if(start < endY){
		for(int i = start + 1; i <= endY; i++){
			int number = numbers[i][endX];
			cout << number << " ";
		}
	}

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

	//从下到上打印一列
	if(start < endY - 1 && start < endX){
		for(int i = endY - 1; i >= start + 1; i--){
			int number = numbers[i][start];
			cout << number << " ";
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值