题目:输入一个矩阵,按照从外向里以顺时针顺序依次打印出每一个数字。例如:如果输入如下矩阵:
1 2 3 4
5 6 7 8
9 10 11 12
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
有三问:
1)如何实现转圈打印矩阵?
2)如何实现顺时针旋转矩阵?
3)如何实现“之”字形打印矩阵?
题外话:
由于要打印输出矩阵,从题目可以看出,数字位数有变化,所以统一按最大位数输出,便于对齐。
使用位于头文件<iomanip>中的格式化函数 std::setw(int n); 来固定每次输出的位数。
1)先来实现转圈打印矩阵。我们以顺时针来转圈。
从整体上来把握。先定义一个打印一圈的函数,根据圈的左上角坐标和右下角坐标来确定圈的大小。
void printOneCircle(int(*matrix)[4], int leftTopX, int leftTopY, int rightBottomX, int rightBottomY)
{
//子矩阵只有一行时
if(leftTopX == rightBottomX)
{
for(int j = leftTopY; j <= rightBottomY; j++)
std::cout << matrix[leftTopX][j] << " ";
endl(std::cout);
}
//当子矩阵只有一列时
else if(leftTopY == rightBottomY)
{
for(int i = leftTopX; i <= rightBottomX; i++)
std::cout << matrix[i][leftTopY] << " ";
endl(std::cout);
}
else
{
int curX = leftTopX;
int curY = leftTopY;
while(curY != rightBottomY){
std::cout << matrix[curX][curY] << " ";
curY++;
}