题目:
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每个数字。如输入
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15
输出 0 1 2 3 7 11 15 14 13 12 8 4 5 6 10 9
思路: 递归
每一次输出外圈的数字, 第一次从a[0][0]开始, 输出 0 1 2 3 7 11 15 14 13 12 8 4
第二次从a[1][1]开始, 输出 5 6 10 9
直到子矩阵的行或列为0停止
代码:
#include <stdlib.h>
#include <iostream>
using namespace std;
#define M 5 //行数
#define N 4 //列数
void Func(int (*a)[N], int row, int col)
{
if (row<=0 || col<=0) // 子矩阵的行或列为0 停止
return;
int begin = (M-row) / 2; //开始输出的索引
int i = 0;
for (; i < col; ++i) //输出外圈上边的行
{
cout << a[begin][i+begin] << " ";
}
if (row == 1) //如果子矩阵为行向量的话 停止
return;
int j = 1;
for (; j < row; ++j) // 输出外圈的右边的列
{
cout << a[begin+j][begin+col-1] << " ";
}
if (col == 1) //如果子矩阵为列向量 停止
return;
j = row - 1;
for (i = col-2; i>=0; --i) //输出外圈下边行
{
cout << a[begin+j][begin+i] << " ";
}
i = 0;
for (j = row-2; j>0; --j) //输出外圈左边列
{
cout << a[begin+j][begin+i] << " ";
}
Func(a, row-2, col-2); //递归
}
void main()
{
int a[][N] = {{0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11}, {12, 13, 14, 15}, {16, 17, 18, 19}};
Func(a, M, N);
system("pause");
}