题目
输入一个维度n 求输出螺旋矩阵。
例1:
3
1 2 3
8 9 4
7 6 5
例2:
4
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
思路
对于一个二维数组,从1开始给元素赋值,依次方向是 → ↓ ← ↑ ,不断循环,直至所有元素赋值结束。那么,就需要明确以下两个问题:
1.如何区别方向?
2.如何判断是否达到边界?达到边界说明方向需要改变。
对于区别方向,只需要定义一个direction变量,其值:0表示→,1表示↓,2表示←,3表示↑。
对于如何判断是否到达边界,有两个条件,一:不能越过数组边界;二:在螺旋式赋值过程中,如果下一个位置上已经存在数字(不为0),则此时改变方向。
代码
#include <stdio.h>
int main()
{
int n=0;
scanf("%d", &n);
int spiral[n][n];//可变长数组
int cnt=n*n; //计数
int i=0, j=0;
for(i=0; i<cnt; i++)
{
spiral[i/n][i%n]=0;//这里将数组置为0,对于可变长数组,定义时初始化
}
int dire=0;//赋值方向,初始时向右
int num=1;
i=0,j=0;
while(cnt--)
{
spiral[i][j]=num++;
switch(dire%4)//dire的值在累加时会超过3
{
case 0://向右
++j;
if(j==n-1 || spiral[i][j+1])//到达数组边界或者下一个位置已经赋值
{
++dire;
}
break;
case 1://向下
++i;
if(i==n-1 || spiral[i+1][j])
{
++dire;
}
break;
case 2://向左
--j;
if(j==0 || spiral[i][j-1])
{
++dire;
}
break;
case 3://向上
--i;
if(i==0 || spiral[i-1][j])
{
++dire;
}
break;
}
}
for(i=0; i<n*n; i++)
{
printf("%d\t", spiral[i/n][i%n]);
i%n==n-1 && printf("\n");
}
return 0;
}
输出结果