龙曲线
龍曲線介紹:
龍曲線是以簡單的數(shù)學(xué)規(guī)則畫出一種曲線,它具有以下形態(tài)。曲線從一個簡單的線段起始,按照一定規(guī)則變換此線段完成整個曲線。每形成一次變換稱為“完成了一次變換代”,而每完成一代,曲線會進(jìn)化到更復(fù)雜的形式。像這種“放大其一小部分的形狀時,表現(xiàn)出與整個形狀極為相似構(gòu)造的圖形”,就是分形。
畫出龍曲線的方法暫且就稱為龍曲線字符串吧!龍曲線字符串由X、Y、F、+、-組成。
那么,要畫出龍曲線就從一個點(diǎn)起始畫出如下曲線即可。
?
F:向前方移動一格并畫線。
+:向左旋轉(zhuǎn)90度。
-:向右旋轉(zhuǎn)90度。
X、Y:忽略。
畫出第0代龍曲線的字符串是FX。從下一代開始,按照如下方式利用前一代字符串進(jìn)行字符替換,從而獲得當(dāng)前一代的龍曲線字符串。
X-> X+YF
Y-> FX+Y
根據(jù)上面的替換式,就有如下的1、2代龍曲線字符串。
第一代:FX+YF
第二代:FX+YF+FX-YF
我們想要求出第n代龍曲線字符串。不過,考慮到答案有可能很長,所以只想計(jì)算出第p個字符起始長度為l個字符的字符串。請編寫程序?qū)崿F(xiàn)這種功能。
輸入
第一行輸入測試用例的個數(shù)C(C<=50)。各測試用例的第一行分別輸入3個整數(shù),即龍曲線的世代n(0<=n<=50)、p以及l(fā)(1<=p<=1 000 000 000、1<=l<=50)。第n代龍曲線字符串的長度可假設(shè)成總是大于等于p+l的數(shù)值。
輸出
每個測試用例在1行內(nèi)輸出第n代龍曲線字符串的第p個字符開始,輸出l個字符。
示例輸入
4
0 1 2
1 1 5
2 6 5
42 764853475 30
示例輸出
FX
FY+YF
+FX-Y
FX-YF-FX+YF+FX-YF-FX+YF-FX-YF-
算法的詳細(xì)設(shè)計(jì)思想:
分別找出字母和“+”“-”號規(guī)律,對其思想分別進(jìn)行函數(shù)構(gòu)造,最后進(jìn)行整合,龍曲線字符串每一代都是前一代的前半部分,代數(shù)只決定了龍曲線字符串長度或者圖形的終止位,但此次要求不輸出圖形只輸出字符串規(guī)律,也就是說所有代數(shù)字符串長度內(nèi)(例如第n代長度為3*2^n-1),相同位置規(guī)律是相同的。
??由題目可推得:
第一代:FX+YF
第二代:FX+YF+FX-YF
第三代:FX+YF+FX-YF+FX+YF-FX-YF
由上式可看出每一代都是下一代前半部分,還可推出兩個規(guī)律,字母規(guī)律和正負(fù)號規(guī)律。
字母規(guī)律:每六個一循環(huán),第一,二,四,五位分別為F,X,Y,F.
符號規(guī)律:符號位都是3的倍數(shù),并且規(guī)律如下。
第一代 ? ? ? ? ? ? ? ? ? ? ?+
第二代 ? ? ? ? ? ? ?+ ? ? ? + ? ? ? -
第三代 ? ? ? ? + ? ?+ ? - ? + ? + ? - ? -
? ? ? ? ? ? ? ? ? ?1 ? ?2 ? 3 ? 4 ? 5 ? 6 ? 7
由上式可看出,每代符號會繼承上一代,并且在它們空隙處按照“+” “-”循環(huán)插入,類如,第三代繼承第二代的2,4,6位置,在1,3,5,7按照“+”“-”循環(huán)插入。由此我們可以推算出在奇數(shù)位上1,3,5,7······上的奇數(shù)位是“+”,偶數(shù)位是“-”。例如7在奇數(shù)中排第四個為“-”。
? ? ? 如果符號在偶數(shù)位,肯定繼承自上一代,對其除2,算出上一代位置直到是奇數(shù)位為止,然后套用上述規(guī)律。
?源代碼:
#include<iostream>
#include<math.h>
using namespace std;
int show(int q)//所選取片段中6位一循環(huán),1,2,4,5位為F,X,Y,F.
{
? ? if(q%6==1||q%6==5) {cout<<"F";}
? ? if(q%6==2) ? ? ? ? {cout<<"X";}
? ? if(q%6==4) ? ? ? ? {cout<<"Y";}
}
int test(int y)//若符號在偶數(shù)除二,直到為奇數(shù)為止。
{
? ?if(y%2==1)
? ?return y;
? ?else test(y/2);
}
int show2(int x)//若此奇數(shù)在所有奇數(shù)中位置為偶數(shù)輸出“-”,否則輸出“+”。
{
? ? int a=test(x);
? ? if(((a+1)/2)%2==0) ?{cout<<"-";}
? ? else ? ? ? ? ? ? ?{cout<<"+";}
}
int main()
{
? ? int i,j,p,l,c,x,n;
? ? cin>>n;
? ? for(j=0;j<n;j++)
? ? {
? ? ? cin>>c>>p>>l;//輸入世代c,起始位置p,長度l。
? ? ? if(p+l>3*pow(2,c)-1)//判斷所求位置是否該代總長度。 ??
cout<<”error”<<endl;?
else
? ? ? for(i=p;i<p+l;i++)
? ? ? {
? ? ? ? ?show(i);//輸出字母。
? ? ? ? ?if(i%3==0)//在3倍數(shù)位為“+” “-”號。
? ? ? ? ? ?{
? ? ? ? ? ? x=i/3;//對“+” “-”號單獨(dú)排序。
? ? ? ? ? ? show2(x);//對“+” “-”號進(jìn)行判斷。
? ? ? ? ? ?}
? ? ? }
? ? ? cout<<""<<endl;
? ? }
}
?
?
總結(jié)
- 上一篇: 电脑速度慢的原因及解决方法
- 下一篇: 生产者消费者问题