【螺旋方阵】

问题描述

螺旋方阵是指一个呈螺旋状的矩阵,它的左上角元素为1,由第一行开始按从左到右,从上到下,从从右向左,从下到上的顺序递增填充矩阵,直到矩阵填充完毕,下图所示是一个5*5阶的螺旋方阵。输入螺旋方阵的阶数N,按行输出该螺旋方阵。

输入说明

输入一个正整数N(1<N<=100)。

输出说明

逐行输出N阶螺旋方阵的元素,元素之间用空格分隔。

输入样例

6

输出样例

1 2 3 4 5 6 
20 21 22 23 24 7 
19 32 33 34 25 8 
18 31 36 35 26 9 
17 30 29 28 27 10 
16 15 14 13 12 11

代码:

#include<stdio.h>
int main()
{
	int n,i,j,b=1,z,sum=0;
	scanf("%d",&n);
	int a[n][n],e=(n+1)/2;
	if(n%2==0)
	{
		for(z=0;z<n/2-1;z++)//计算圈数(一个正方形为一圈)
		{
			for(j=z,i=z;j<n-z&&i==z;j++,b++)//输出上边的公式
			{
				a[i][j]=b;
				
			}
			for(i=z+1;i<n-z&&j==n-z;i++,b++)//输出右边的公式
			{
				a[i][j-1]=b;//j在上面多加了一次
				
			}
			for(j=n-z-2;j>=z&&i==n-z;j--,b++)//输出下边的公式
			{
				a[i-1][j]=b;//i多加了一次
			
			}
			for(i=n-z-2;i>=z+1&&j==z-1;i--,b++)//输出左边的公式
			{
				a[i][j+1]=b;//j多减了一次
			}
		}
		if(z==n/2-1)//最后一圈情况特殊
		{
			for(j=z,i=z;j<n-z&&i==z;j++,b++)
			{
				a[i][j]=b;
				
			}
			for(i=z+1;i<n-z&&j==n-z;i++,b++)
			{
				a[i][j-1]=b;
				
			}
			for(j=n-z-2;j>=z&&i==n-z;j--,b++)
			{
				a[i-1][j]=b;
				
			}
			a[n/2][n/2-1]=n*n;//补孔
		}
    }
    if(n%2!=0)
	{
		for(z=0;z<(n-1)/2;z++)
		{
			for(j=z,i=z;j<n-z&&i==z;j++)
			{
				a[i][j]=b;
				b++;
			}
			for(i=z+1;i<n-z&&j==n-z;i++)
			{
				a[i][j-1]=b;
				b++;
			}
			for(j=n-z-2;j>=z&&i==n-z;j--)
			{
				a[i-1][j]=b;
				b++;
			}
			for(i=n-z-2;i>=z+1&&j==z-1;i--)
			{
				a[i][j+1]=b;
				b++;
			}
		}
		a[e-1][e-1]=n*n;
    }
    for(i=0;i<n;i++)
    {
    	for(j=0;j<n;j++)
    	{
    		printf("%d ",a[i][j]);
    		sum++;
    		if(sum%n==0) printf("\n");
		}
	}
	return 0;
}

 

先分奇偶性:奇数最后要填补最中间一个数

主要思路就是一圈一圈地进行输入

然后要注意一些细节调整

本菜鸡在看到这个问题的时候就傻了,然后去搜了一下没有找到好理解的代码,但是确定了一个重要算法:一圈一圈输入,于是就找输入每一圈的通用公式,写出大致框架后再去修改细节。修改了一个小时.....这题总耗时快2个小时.....
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值