首页 > 编程知识 正文

创建n阶螺旋矩阵并输出,顺时针螺旋输出矩阵

时间:2023-05-04 17:24:26 阅读:190808 作者:1478

题目
输入一个维度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;}

输出结果

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。