蛇形填数问题

来源:互联网 发布:冰动娱乐 知乎 编辑:程序博客网 时间:2024/05/16 01:30

描述
在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 16 9 25 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



1 0
原创粉丝点击