URAL 1549 Another Japanese Puzzle(構造)

 

題目大意

 

構造一條閉合路線,使得路線不能相交,而且走直線的步數小於等於 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 }
URAL 1549

 

題目鏈接 & AC通道

 

URAL 1549 Another Japanese Puzzle

相關文章
相關標籤/搜索