螺旋矩阵

下面是一个5×5的螺旋方阵,试编程打印出此形式的n×n(n<10)阶的方阵。

    1   2   3  4   5

    16  17  18 19  6

    15  24  25 20  7

    14  23  22 21  8

    13  12 11  10  9 


    此题的关键在于如何有效控制填充数的位置,从题中可以发现,填充数是按着“先向右,再向下,再向左,再向上”的顺序进行变化的,不妨将其称为方向。如果方向知道了,则下一个需要填充的位置也就知道了。因此,这个题的关键在于有效控制方向。方向的变化也需要根据填充数的位置进行,并应该与已经填充的数字避免冲突。因此,可以首先将数组中所有位置赋初值0,随着填充的进行,如果数不为0,则说明这个位置已经填上数字,因此方向应该发生改变。

    参考代码如下:

#include <stdio.h>
#define N 5
int main()
{
	int a[N][N]={0};
	int direction=1;
	int i,j;
	int x,y;

	x=0;y=0; //initial position

	for(i=1;i<=N*N;i++)
	{
		a[x][y]=i;
		switch(direction)
		{
		case 1: if(a[x][y+1]||y==N-1)
					direction=2;
			break;
		case 2: if(a[x+1][y]||x==N-1)
					direction=3;
			break;
		case 3: if(a[x][y-1]||y==0)
					direction=4;
			break;
		case 4: if(a[x-1][y]||x==0)
					direction=1;
			break;
		}

		switch(direction){
		case 1: y++; break;
		case 2: x++; break;
		case 3: y--; break;
		case 4: x--; break;
		}
	}

	for(i=0;i<N;i++){
		for(j=0;j<N;j++)
			printf("%4d",a[i][j]);
		printf("\n");
	}

	return 0;
}




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值