习题:输出螺旋矩阵

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

输出结果
在这里插入图片描述

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值