蛇形填数问题

描述
在n*n方陈里填入1,2,...,n*n,要求填成蛇形。例如n=4时方陈为:
10 11 12 1
9 16 13 2
8 15 14 3
7 6 5 4
输入
直接输入方陈的维数,即n的值。(n<=100)
输出
输出结果是蛇形方陈。
样例输入
3
样例输出
7 8 1
6 9 2
5 4 3

时间限制:3000 ms  |  内存限制:65535 KB

以下为解题过程:

基本的思路为先假设做出5X5的蛇行数

13 14 15 16 1 
12 23 24 17 2 
11 22 25 18 3 
10 21 20 14 4 
9  8  7  6  5

首先划内存中分出一个5*5的二位数组,但是实际上并不是确定的,会用到动态分配,无论怎样,数字1总是会从数组的右上角开始,首先向下开始填数,基本思路是,写一个循环,每轮循环中有4轮并列循环,分别代表4个方向,首先往下走,在往左走,接下来往上走,最后往右走,走到起始位置,然后进入第二层,如此直到走到最里面

代码实现如下:

#include <stdio.h>
#include <stdlib.h>

int main()
{
	int n;
	scanf("%d",&n);

	int *p=(int *)malloc((n*n)*sizeof(int));
	int  m=n-1;
	int  i;//指向的位置 
		i=n-1;
   	int num=1;
	while(m>0)
	{	int a,b,c,d;
		a=m;b=m;c=m;d=m;
	
		while(a)
		{
			p[i]=num;
			i+=n;
			num++;
			a--;	
		}
		while(b)
		{
			p[i]=num;
			i--;
			num++;	
			b--;
		}
		while(c)
		{
			p[i]=num;
			i-=n;
			num++;
			c--;
		}
		while(d)
		{
			p[i]=num;
			i++;
			num++;
			d--;
		}
		
		i=i+n-1;
	//	printf("i=%d\n",i);
		m-=2;
		if(m<0)
			break; 
		
	}
		p[i]=num;
	
	int x,y;
	for(x=0;x<n;x++){
		for(y=0;y<n;y++){
			printf("%d ",p[x*n+y]);
		}
		printf("\n");
	}
	 	return 0;
}

运行结果:


外层循环代表的是,每个方向需要走的步数,也就是当小于0的时候,便走到了最里面的蛇尾。 
这里有一点需要注意的是,内层循环每次结束后,到达的总是这层的右上角,也就是行数要加上列数-1到内层的起点。


当然,我写的代码并不是有多高的效率,不过也是自己想出来的,以后如果有更好的方法,也会做些修改。

>

学习之余写下自己学习编程的新的,希望自己越来越进步!

2016.6.15



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值