【问题描述】创建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
把矩阵看做一个二维坐标轴,设x和y共同组成矩阵要赋值的位置,x_add和y_add分别表示每次赋值时x的增量和y的增量,用num表示每次横向移动或纵向移动时最后一个位置的值,num_add表示每次移动方向发生变化时num的增量。
用上述几个变量共同确定每次赋值时对应的矩阵位置,然后以(0,0)为起始位置,以横向为初始移动位置,从而实现从边沿到内部螺旋移动的方式为矩阵赋值。最终形成的矩阵就是目的螺旋矩阵。实现方式如下:
#include<iostream>
using namespace std;
void func(int n)
{
int a[n][n];
int x = 0,y = -1; //x,y表示当前数组要赋值的位置
int x_add = 0, y_add = 1; //每次赋值时,x和y的增量
int num = n,num_add = n; //num:移动方向发生变化的转变点,num_add:每次转变时num的增量
for(int i=1;i<=n*n;i++)
{
x += x_add;
y += y_add;
a[x][y] = i;
if(i == num) //移动方向发生转变
{
if(y_add == 1 || y_add == -1) //横向变纵向
{
x_add = y_add;
y_add = 0;
num_add--;
num += num_add;
}
else //纵向变横向
{
y_add = -x_add;
x_add = 0;
num += num_add;
}
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cout<<a[i][j]<<" ";
}
cout<<endl;
}
}
int main()
{
int n;
cin>>n;
while(n!=0)
{
func(n);
cin>>n;
}
}
代码效果如下: