龙曲线 [分形] 从 DFS暴力 到 规律 实现
龙曲线
龙曲线是以简单的数学规则画出一种曲线,它具有以下形态。曲线从一个简单的线段起始,按照一定规则变换此线段完成整个曲线。每形成一次变换称为“完成了一次变换代”,而每完成一代,曲线会进化到更复杂的形式。像这种“放大其一小部分的形状时,表现出与整个形状极为相似构造的图形”,就是分形。
画出龙曲线的方法暂且就称为龙曲线字符串吧!龙曲线字符串由X、Y、F、+、-组成。
那么,要画出龙曲线就从一个点起始画出如下曲线即可。
F:向前方移动一格并画线。
+:向左旋转90度。
-:向右旋转90度。
X、Y:忽略。
画出第0代龙曲线的字符串是FX。从下一代开始,按照如下方式利用前一代字符串进行字符替换,从而获得当前一代的龙曲线字符串。
X-> X+YF
Y-> FX+Y
根据上面的替换式,就有如下的1、2代龙曲线字符串。
第一代:FX+YF
第二代:FX+YF+FX-YF
我们想要求出第n代龙曲线字符串。不过,考虑到答案有可能很长,所以只想计算出第p个字符起始长度为l个字符的字符串。请编写程序实现这种功能。
输入
第一行输入测试用例的个数C(C<=50)。各测试用例的第一行分别输入3个整数,即龙曲线的世代n(0<=n<=50)、p以及l(1<=p<=1 000 000 000、1<=l<=50)。第n代龙曲线字符串的长度可假设成总是大于等于p+l的数值。
输出
每个测试用例在1行内输出第n代龙曲线字符串的第p个字符开始,输出l个字符。
示例输入
4
0 1 2
1 1 5
2 6 5
42 764853475 30
示例输出
FX
FX+YF
+FX-Y
FX-YF-FX+YF+FX-YF-FX+YF-FX-YF-
首先是暴力 代码
#include<iostream>
using namespace std;void dfs(string str, int N) {if(N == 0) {cout << str;return;}for(int i = 0; i < str.size(); ++i) {if(str[i] == 'X')dfs("X+YF", N - 1);else if(str[i] == 'Y')dfs("FX-Y", N - 1);elsecout << str[i];}
}int main() {int n;cin >> n;dfs("FX", n);
}
这里我们爆出 1 到 5 的数据表
第一代:FX+YF // 5
第二代:FX+YF+FX-YF // 11
第三代:FX+YF+FX-YF+FX+YF-FX-YF // 23
第四代:FX+YF+FX-YF+FX+YF-FX-YF+FX+YF+FX-YF-FX+YF-FX-YF // 47
五: FX+YF+FX-YF+FX+YF-FX-YF+FX+YF+FX-YF-FX+YF-FX-YF \+FX+YF+FX-YF+FX+YF-FX-YF-FX+YF+FX-YF-FX+YF-FX-YF
字符数:sum[i] = (sum[i-1] << 1) + 1;
字母规律:循环节 FXYFFXYF
符号规律:
1. +
2. + + -
3. + + - + + - -
4. + + - + + - - + + + - + + - -
5. + + - + + - - + + + - + + - - + + + - + + - - + + + - + + - -
发现 每个字符 前后的空隙 轮着插 + -;
所以 再倍增上一个的同时 把 + - 依次插入
这也是为什么 字符数:sum[i] = (sum[i-1] << 1) + 1; 是这样规律
那么 我们选择 每次将 非 0, 2, 4 位置的F X Y以外 的下表 首先 / 3
然后不断 / 2 只到达到奇数位
例如 第 3 代
1 2 3 4 5 6 7+ + - + + - - 第一位 + 1 mod 4 = 2 :+第二位 / 2 之后 + 1 mod 4 = 2:+第三位 +1 mod 4 = 0 :-第四位 / 2 / 2 + 1 mod 4 = 2 :+第五位 + 1 mod 4 = 2 : +第六位 / 2 + 1 mod 4 = 0 : -第七位 + 1 mod 4 = 0 : -大体上是这样的一般规律 其实mod 2在搞规律也行 我找的时候当4的循环节了 同时mod 4也是因为我前面没有处理好
#include<bits/stdc++.h>
using namespace std;void get_c(int &x) {while(x % 2 == 0) {x /= 2;}
} // 确定第 x 位 属于O, E层次void output(int x) {if(x % 6 == 2) // 循环节 2pcout << "X";else if(x % 6 == 4) // 循环节 3pcout << "Y";else if(x % 3 == 0) {x = x / 3;get_c(x); // 降 kif((x + 1) % 4 == 2) {cout << "+";} elsecout << "-";} elsecout << "F"; // 循环节 1p
}void sol(int p, int l) {for(int i = 0; i < l; i++) {int k = p + i;output(k);}cout << endl;
}int main() {int cas;for(cin >> cas; cas--;) {int n, p, l;cin >> n >> p >> l;sol(p, l);}return 0;
}
龙曲线 [分形] 从 DFS暴力 到 规律 实现相关推荐
- 分形 —— 龙曲线的构造
龙曲线的构造如果仅仅通过文字描述的话,可能会略显抽象,这里有一个可视化的视频,讲述整个龙曲线的从无到有,从简单到复杂的构造过程,[分形几何]<侏罗纪公园>原著里神奇的"龙曲线&q ...
- ZOJ 3300 Mahjong DFS暴力解决。。
ZJU 3300: 题目描述 就看成1-9的数字,DFS暴力搜索下就过了..... 要求输入13 个数字,声明个数组记录数字的个数,DFS 里各种回溯: #include<stdio.h> ...
- Codeforces9C dfs暴力
一道水题,dfs暴力就行. #include <stdio.h>int ans = 0, num; void dfs(int n) {if(n > num)return;dfs(n ...
- C-木棍游戏 DFS暴力
题目链接:C-木棍游戏_牛客小白月赛43 (nowcoder.com) #include<algorithm> #include<cstdio> #include<cst ...
- [CF750D] New Year and Fireworks(暴力,规律,dfs)
题目链接:http://codeforces.com/contest/750/problem/D 题意:烟花看做n层,第i层的格子可以朝45°方向的格子扩展ti次,问有多少格子可以被经过. vis(x ...
- nssl1321,jzoj(初中)2106-买门票【dfs,暴力,字符串】
正题 题目大意 给定一些字母,用字母组成一个单词要求满足 从小到大 有1个元音字母 有2个辅音字母 长度为LLL 输出字典序最小的250002500025000个. 解题思路 暴力搜索时间复杂度 O( ...
- WUST 2090 HLD与停车场(bfs||dfs||暴力模拟||巧妙思维)
2090: HLD与停车场 Time Limit: 1 Sec Memory Limit: 128 MB 64bit IO Format: %lld Submitted: 21 Accep ...
- [HDU 1427]速度计算24点(DFS暴力搜索)
主题连接: http://acm.hdu.edu.cn/showproblem.php?pid=1427 思路:简单的DFS.dfs(sum,next,p)表示当前已经算出的值是sum,括号里算 ...
- 添加中文数据出现问号_怪物猎人世界绚辉龙和冥赤龙的出现时间规律一览
估计在七月上旬煌黑龙出现前,所有的活动任务都不会消失,唯一在变的元素就是绚辉龙和冥赤龙这两条特殊的古龙. 绚辉龙和冥赤龙目前看来是交替出现的,也就是说有绚辉龙的日子就不会有冥赤龙,每条龙分别驻场两周. ...
最新文章
- 【腾讯面试题】熊出没
- 美丽新世界:这七个原因将让未来更美好
- 有道精品课python-Python:7行代码爬取有道词典
- centos7.5 下LNMP搭建
- Android之圆角矩形
- 数字货币交易所数据安全随笔
- [技术分享]【DLI跨源】当DLI遇见MongoDB
- 【华为云分享】机器学习笔记(七) ---- 贝叶斯分类
- linux服务器数据备份到本地硬盘_等保数据备份和恢复关键点,这些你该知道!...
- 我学Flash/Flex(2):AS3读取XML文件内容
- 图片怎么去底色?怎么去图片背景为透明?
- 饥荒如何解锁机器人_饥荒人物怎么解锁
- 求一个数的最大真约数
- 【Segmentation】
- ResultSet.TYPE_SCROLL_SENSITIVE到底发生了什么?
- (十五)使用任务通知实现命令行解释器
- sql server 经典练习题分享二
- 游戏阴阳师启动闪退问题解决
- Excel基础—Office2019安装
- numpy pandas matplotlib 学习笔记