#include <iostream>
#include <iomanip>
using namespace std;
#define N 9
int Matrix[N][N] = {0};
int main()
{
void FillMatrix(int matrix[N][N], int size, int number, int origin);
void OutputMatrix(int matrix[N][N], int size);
FillMatrix(Matrix, N, 1, 0);
OutputMatrix(Matrix, N);
return 0;
}
void FillMatrix(int matrix[N][N], int size, int number, int origin)
//matrix为总矩阵,size为当前矩阵的大小(即边长),number为当前要填的第一个数,
//origin为当前矩阵第一个数的位置
{
if(size == 0)
return;
//递归终止条件一
if(size == 1)
{
matrix[origin][origin] = number;
return;
} //递归终止条件二
int i = 0;
int row = origin, column = origin;
matrix[row][column] = number; //填写左上角第一个数
number++;
for(i = 0; i < size - 1; i++)
{
row++;
matrix[row][column] = number;
number++;
}//填写左边一竖列
for(i = 0; i < size - 1; i++)
{
column++;
matrix[row][column] = number;
number++;
}//填写下面一行
for(i = 0; i < size - 1; i++)
{
row--;
matrix[row][column] = number;
number++;
}//填写右边一竖列
for(i = 0; i < size - 2; i++)
{
column--;
matrix[row][column] = number;
number++;
}//填写上边一行
FillMatrix(matrix, size - 2, number, column);
//不同于算法一,本算法中number、column均已自增自减到相应数值,故不需再列算式
}
void OutputMatrix(int matrix[N][N], int size)
{
int row = 0, column = 0;
cout << endl << endl << endl;
//先输出三空行,使输出的第一行数不顶格,看起来更美观
for(row = 0; row < N; row++)
{
for(column = 0; column < N; column++)
cout << setiosflags(ios::right) << setw(4) << matrix[row][column] << '\t';
//右对齐,输出宽度设置为4
cout << endl << endl << endl;
}
}
这是清华大学出版社《程序设计基础》(第三版)中吴文虎老师的算法。
算法二与之前的算法一的测试结果是完全一样的。测试数据如下:(very beautiful!)
以下是N=15时的情况,我的ThinkPad屏幕已经显示不了全部矩阵了: