求解n阶螺旋矩阵问题

【问题描述】创建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;
	} 
}

代码效果如下:
在这里插入图片描述

原创文章 14 获赞 16 访问量 6876

猜你喜欢

转载自blog.csdn.net/qq_37638909/article/details/82954342