[问题描述] 创建n阶螺旋矩阵并输出。
[输入描述] 输入包含多个测试用例,每个测试用例为一行,包含一个正整数n(1 <= n <= 50)以输入0表示结束
[输出描述] 每个测试用例输出n行,每行包括n个整数,整数之间用一个空格分隔.
[输入样例] 4
0
[样例输出] 1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
[思路] 采用递归方法求解,设f(x,y,start,n)用于创建左上角(x,y) 起始元素值为start的阶螺旋矩阵,共n行n列,它是大问题;则f(x+1,y+1,start,n-2)用于创建左上角为(x+1,y+1)、起始元素值为start的n-2阶螺旋矩阵,共n-2行n-2列,它是小问题。
对应的递归模型如下:
f(x,y,start,n) = 不做任何事情 当n <= 0时
f(x,y,start,n) = 产生只有一个元素的螺旋矩阵 当n = 1时
f(x,y,start,n) = 产生(x,y)的那一圈;f(x+1,y+1,start,n-2)
[完整程序]
#include <iostream>
using namespace std;
#define MAXN 51
//问题表示
int n;
//求解结果表示
int s[MAXN][MAXN];//存放螺旋矩阵
void Spiral(int x,int y,start,n)//递归创建螺旋矩阵
{
int i,j;
if(n <= 0)
{
return;
}
if(n == 1)
{
s[x][y] = start;
return;
}
for(i = x;i < x + n - 1;i++)//上一行
{
s[y][i] = start++;
}
for(j = y;j < y + n - 1;j++)//右一列
{
s[j][x + n - 1] = start++;
}
for(i = x + n - 1;i > x;i--)//下一行
{
s[y + n - 1][i] = start++;
}
for(j = y + n - 1;j > y;j--)//左一列
{
s[j][x] = start++;
}
Spiral(x+1,y+1,start,n-2);//递归调用
}
void dispMatrix()//输出螺旋矩阵
{
for(i = 0;i < n;i++)
{
for(int j = 0;j < n;j++)
{
cout << s[i][j] << "\t";
}
cout << endl;
}
}
int main()
{
while(true)
{
cin >> n;
if(n == 0)
{
break;
Spiral(0,0,1,n);
dispMatrix();
}
}
return 0;
}