题目
输入一个维度n 求输出螺旋矩阵。
例1:
3123 894 765
例2:
412341213145111615610987
思路
对于一个二维数组,从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("%dt", spiral[i/n][i%n]); i%n==n-1 && printf("n"); } return 0;}
输出结果