描述
在n*n方陈里填入1,2,...,n*n,要求填成蛇形。例如n=4时方陈为:
10 11 12 1
9 16 13 2
8 15 14 3
7 6 5 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