龙曲线是以简单的数学规则画出一种曲线,它具有以下形态。曲线从一个简单的线段起始,按照一定规则变换此线段完成整个曲线。每形成一次变换称为“完成了一次变换代”,而每完成一代,曲线会进化到更复杂的形式。像这种“放大其一小部分的形状时,表现出与整个形状极为相似构造的图形”,就是分形,画出龙曲线的方法暂且就称为龙曲线字符串吧!龙曲线字符串由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个字符的字符串。请编写程序实现这种功能。
3.3源代码
#include<iostream>
#include<string>
using namespace std;
string s1("X+YF");//定义全局变量s1
string s2("FX-Y");//定义全局变量s2
string ss;
string s3;
void creat(string &s, int g)//生成龙曲线的函数
{
if (g == 0)
{
ss += s;
return;
}
for (int i = 0; i<s.size(); i++)
{
if (s[i] == 'X')//遇到X 则X——>X+YF
creat(s1, g - 1);
else
if (s[i] == 'Y')//遇到Y 则Y——>FX-Y
creat(s2, g - 1);
else
ss += s[i];
}
}
void catchS(string &s, int g, int p, int l)
//获取第g代从p开始长度为l的字符串
{
creat(s, g);
s3.assign(ss, p - 1, l);
cout << s3 << endl;
}
int main()
{
int c;
int i;
string s("FX");
cout << "input c" << endl;
cin >> c;
cout << "input g " << "input p " << "input l " << endl;
for (i = c; i>0; i--)
{
int g;
int p;
int l;
cin >> g >> p >> l;
ss = "";
s3 = "";
catchS(s, g, p, l);
}
}