构造一条闭合路线,使得路线不能相交,而且走直线的步数小于等于 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 }