龙曲线
龍曲線介紹:
龍曲線是以簡單的數學規則畫出一種曲線,它具有以下形態。曲線從一個簡單的線段起始,按照一定規則變換此線段完成整個曲線。每形成一次變換稱為“完成了一次變換代”,而每完成一代,曲線會進化到更復雜的形式。像這種“放大其一小部分的形狀時,表現出與整個形狀極為相似構造的圖形”,就是分形。
畫出龍曲線的方法暫且就稱為龍曲線字符串吧!龍曲線字符串由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
FY+YF
+FX-Y
FX-YF-FX+YF+FX-YF-FX+YF-FX-YF-
算法的詳細設計思想:
分別找出字母和“+”“-”號規律,對其思想分別進行函數構造,最后進行整合,龍曲線字符串每一代都是前一代的前半部分,代數只決定了龍曲線字符串長度或者圖形的終止位,但此次要求不輸出圖形只輸出字符串規律,也就是說所有代數字符串長度內(例如第n代長度為3*2^n-1),相同位置規律是相同的。
??由題目可推得:
第一代:FX+YF
第二代:FX+YF+FX-YF
第三代:FX+YF+FX-YF+FX+YF-FX-YF
由上式可看出每一代都是下一代前半部分,還可推出兩個規律,字母規律和正負號規律。
字母規律:每六個一循環,第一,二,四,五位分別為F,X,Y,F.
符號規律:符號位都是3的倍數,并且規律如下。
第一代 ? ? ? ? ? ? ? ? ? ? ?+
第二代 ? ? ? ? ? ? ?+ ? ? ? + ? ? ? -
第三代 ? ? ? ? + ? ?+ ? - ? + ? + ? - ? -
? ? ? ? ? ? ? ? ? ?1 ? ?2 ? 3 ? 4 ? 5 ? 6 ? 7
由上式可看出,每代符號會繼承上一代,并且在它們空隙處按照“+” “-”循環插入,類如,第三代繼承第二代的2,4,6位置,在1,3,5,7按照“+”“-”循環插入。由此我們可以推算出在奇數位上1,3,5,7······上的奇數位是“+”,偶數位是“-”。例如7在奇數中排第四個為“-”。
? ? ? 如果符號在偶數位,肯定繼承自上一代,對其除2,算出上一代位置直到是奇數位為止,然后套用上述規律。
?源代碼:
#include<iostream>
#include<math.h>
using namespace std;
int show(int q)//所選取片段中6位一循環,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)//若符號在偶數除二,直到為奇數為止。
{
? ?if(y%2==1)
? ?return y;
? ?else test(y/2);
}
int show2(int x)//若此奇數在所有奇數中位置為偶數輸出“-”,否則輸出“+”。
{
? ? 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倍數位為“+” “-”號。
? ? ? ? ? ?{
? ? ? ? ? ? x=i/3;//對“+” “-”號單獨排序。
? ? ? ? ? ? show2(x);//對“+” “-”號進行判斷。
? ? ? ? ? ?}
? ? ? }
? ? ? cout<<""<<endl;
? ? }
}
?
?
總結
- 上一篇: 电脑速度慢的原因及解决方法
- 下一篇: linux xilinx,Xilinx-