题目描述
给定一个nxn(n<10)的方阵,请输出左上角开始逆时针从大到小填充方阵的结果。
输入格式输入方阵的大小n
输出格式方阵填充结果,每个数字均占两位并右对齐,以一个空格隔开
样例输入
4样例输出
16 5 6 7 15 4 1 8 14 3 2 9 13 12 11 10
//本题最重要的经验就是:C++中数组一定要指定规模,即数组定义时下标必须是常量
//为什么这一题要求n < 10,就是方便考生先设一个10 * 10 的数组
//然后一个经验时:辅助函数的二维数组形参,也要写出二维数组的规模,即写出常量下标
//在调用辅助函数时,实参直接写数组名就行了,这样比**Matrix或*Matrix[]更不容易出错
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
void FillMatrix(int matrix[10][10], int size, int number, int origin);
void OutputMatrix(int matrix[10][10], int size);
int n;
cin >> n;
int Matrix[10][10] = {0};
FillMatrix(Matrix, n, n * n, 0);
OutputMatrix(Matrix, n);
return 0;
}
void FillMatrix(int matrix[10][10], int size, int number, int origin)
//matrix为总矩阵,size为当前矩阵的大小(即边长),number为当前要填的第一个数,
//origin为当前矩阵第一个数的位置
{
if(size == 0)
return;
//递归终止条件一
if(size == 1)
{
matrix[origin][origin] = number;
return;
} //递归终止条件二
for(int i = 0; i < size - 1; i++)
//循环变量i
{
matrix[origin + i][origin] = number - i;
//列号origin不变,行号origin + i 随i的自增而自增,填满当前矩阵左边的竖列
matrix[origin + size - 1][origin + i] = number - (size - 1) - i;
//行号origin + size - 1 表示当前最下面一行,列号origin + i 随i的自增而自增,填满下面一行
matrix[origin + size - 1 - i][origin + size - 1] = number - 2 * (size - 1) - i;
//行号origin + size - 1 - i随i自增而自减,行逐渐上升,列号为当前最右边一列
matrix[origin][origin + size - 1 - i] = number - 3 * (size - 1) - i;
//行号origin表示当前最上面一行,列号origin + size - 1 - i随i自增而自减,填满上面一行
}
FillMatrix(matrix, size - 2, number - 4 * (size - 1), origin + 1);
}
void OutputMatrix(int matrix[10][10], int size)
{
int row = 0, column = 0;
for(row = 0; row < size; row++)
{
for(column = 0; column < size; column++)
cout << setiosflags(ios::right) << setw(2) << matrix[row][column] << ' ';
//右对齐,输出宽度设置为2
cout << endl;
}
}