蛇形填数问题
来源:互联网 发布:冰动娱乐 知乎 编辑:程序博客网 时间:2024/05/16 01:30
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
- 蛇形填数问题
- 蛇形填数问题
- 蛇形填数问题
- 蛇形填数问题(ACM入门)
- 关于蛇形填数问题求解
- 有关蛇形填数的问题
- NYOJ-33蛇形填数问题
- 蛇形填数
- 算法:蛇形填数
- 蛇形填数
- 蛇形填数
- 蛇形填数
- 蛇形填数
- C++蛇形填数
- 蛇形填数
- 蛇形填 数
- 蛇形填数
- NYOJ - 蛇形填数
- 【GDOI2016模拟3.15】染色
- 什么是Activity,详细介绍Activity
- C++常识之——C++中堆和栈的区别,自由存储区、全局/静态存储区和常量存储区(转)
- 智能指针的实现
- HttpURLConnection的用法
- 蛇形填数问题
- 仿win8磁贴界面以及功能
- 符号重载函数 友元函数
- Lisp简明教程
- JavaWeb学习之HibernateDaoSupport使用
- 符号重载函数
- html在线学习网站
- 剑指offer--快速排序递归实现,年龄排序O(N)实现,旋转数组最小值查找
- 【bzoj1067】【SCOI2007】【降雨量】【线段树+分类讨论】