这道题题目是;输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
解题思路为:
(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;
}
}