構造一條閉合路線,使得路線不能相交,而且走直線的步數小於等於 S,轉彎(左轉和右轉)的步數小於等於 T。(0≤S,T≤1000)ios
求一條最長的路線ide
注意到,由於要求路線閉合,那麼轉彎的數量 T 必須大於等於 4,不然無解。spa
適當 YY 下:只能用偶數個 S 和偶數個 T,否則不可能構成閉合路徑。怎麼證實,不會...code
狀況1:S<2blog
這種狀況下,咱們不能使用直走的命令,只能經過不斷的轉彎來實現題目要求的路徑,在紙上畫了畫,大體圖形以下:get
T=4 時: T=8:沒有 T=12:
T=16: ?string
仔細觀察 T=4 時候的圖形和 T=12 時的圖形,看能不能把 T=4 的時候的圖形添加進 T=12 時的圖形中,構成 T=16 時的圖形?io
仔細想一想以後...event
下面是個人構造方法:,固然,還有其餘的方法,不過都大同小異class
知道了怎麼由 T=12 構造 T=16 的狀況,不可貴到由 T=16 構造 T=20 的方法,以及以後的構造方法
不可貴到 T≥12 時,構造的通項公式:RLLRLL(RL)xRLLRLL(RL)x 其中, x=(T-12)/4
當 T<12 時,只有一種狀況:LLLL
至此,狀況1已經解決
狀況2:S≥2
這種狀況下,咱們須要使用 S 來走直線,具體是怎麼作呢?
首先須要 4 個 LLLL 使路徑有成爲閉合路徑的可能。還剩下 [(T-4)/2]*2 的彎要轉,爲了讓轉彎以後扔然保持原來的運動方向,我把 LR 捆在一塊兒,即左轉和右轉配合。首先令:x=(T-4)/2,表示有幾對 LR,而後再分類討論:
一、x 是偶數
不難想到,我能夠先直着走,再走 LR,再轉彎,到達另外一邊,再直着走,再轉彎到達第三邊,而後直着走,接着走 LR,再轉彎,到達第四邊,直着走,再轉彎,回到出發點。若是路徑嚴格對稱的話,中間確定不相交。怎麼保證可以回到出發點呢構成閉合路徑呢?看看下面的圖:
當 x=2(T=8 或 9),S=2 或 3 時的路徑圖:,其中:藍色表示轉彎到達另外一邊,橙色表示直走,深紅色表示 LR 對
根據這個,不可貴出當 x 等於偶數時候的通項公式:FS/2(LR)(T-4)/4LLFS/2(LR)(T-4)/4LL
二、x 是奇數
和 x 是偶數時的走法差很少,雖然不能使路徑嚴格對稱,不過仍是能夠辦到的,爲了便於說明,先給一張圖
當 x=3(T=10 或 11),S=4 或 5 時的路徑圖: 不一樣顏色表明的意義仍是和上面一幅圖相同
稍稍分析上面的圖,不可貴出當 x 等於奇數時候的通項公式:F(S-2)/2(LR)[(T-4)/4]+1LLFS/2(LR)(T-4)/4LFL
至此,全部狀況考慮徹底了...
作出來這題,好大的知足感啊!
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 5 using namespace std; 6 7 int F, T; 8 9 int main() 10 { 11 while(scanf("%d%d", &F, &T)!=EOF) 12 { 13 if(T<4) 14 { 15 printf("Atawazu\n"); 16 continue; 17 } 18 if(F<2) 19 { 20 if(T<12) 21 { 22 printf("4\nLLLL\n"); 23 continue; 24 } 25 else 26 { 27 printf("%d\n", 12+((T-12)/4)*4); 28 int x=(T-12)/4; 29 printf("RLLRLLRL"); 30 for(int i=0; i<x; i++) printf("RL"); 31 printf("LRLL"); 32 for(int i=0; i<x; i++) printf("RL"); 33 printf("\n"); 34 continue; 35 } 36 } 37 printf("%d\n", (F/2)*2+(T/2)*2); 38 int x=(T-4)/2; 39 if(x%2==0) 40 { 41 for(int i=0; i<F/2; i++) printf("F"); 42 for(int i=0; i<x/2; i++) printf("LR"); 43 printf("LL"); 44 for(int i=0; i<F/2; i++) printf("F"); 45 for(int i=0; i<x/2; i++) printf("LR"); 46 printf("LL"); 47 } 48 else 49 { 50 for(int i=0; i<F/2-1; i++) printf("F"); 51 for(int i=0; i<=x/2; i++) printf("LR"); 52 printf("LL"); 53 for(int i=0; i<F/2; i++) printf("F"); 54 for(int i=0; i<x/2; i++) printf("LR"); 55 printf("LFL"); 56 } 57 printf("\n"); 58 } 59 return 0; 60 }