牛客网-乌龟跑步-(四维dfs)

链接:https://ac.nowcoder.com/acm/problem/15294
来源:牛客网

题目描述

有一只乌龟,初始在0的位置向右跑。
这只乌龟会依次接到一串指令,指令T表示向后转,指令F表示向前移动一个单位。乌龟不能忽视任何指令。
现在我们要修改其中正好n个指令(一个指令可以被改多次,一次修改定义为把某一个T变成F或把某一个F变成T)。
求这只乌龟在结束的时候离起点的最远距离。(假设乌龟最后的位置为x,我们想要abs(x)最大,输出最大的abs(x))

输入描述:

第一行一个字符串c表示指令串。c只由F和T构成。
第二行一个整数n。
1 <= |c| <= 100, 1 <= n <= 50

输出描述:

一个数字表示答案。
示例1

输入

FT
1

输出

2
示例2

输入

FFFTFFF
2

输出

6
 1 #include<stdio.h>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<math.h>
 6 #include<string>
 7 #define ll long long
 8 #define inf 0x3f3f3f3f
 9 using namespace std;
10 
11 string str;
12 int n,ans,m,len;
13 bool mp[105][55][205][2];///操作次数 剩余修改次数 位置 方向
14 ///二维中0表示往回走,1表示往前走
15 
16 
17 void dfs(int step,int s,int x,int d)///操作到哪个指令 剩余修改指令次数 当前位置 方向
18 {
19     if(s<0) return ;///dfs递归进来后,修改次数不够
20     int flag;
21     if(d==-1)
22         flag=0;///往回走
23     else
24         flag=1;///往前走
25     if( mp[step][s][x+100][flag] )  return;///如果这套状态之前的dfs中走出现过,直接返回,因为以前已经往不同情况dfs过了
26     mp[step][s][x + 100][flag] = true;///标记出现过的情况
27     if(step==len)///指令已经操作完了,可以结束了
28     {
29         if(s%2==0) ///如果修改指令的次数还剩偶数次,这个答案是可行的,否则不行
30             ans=max(ans,abs(x));
31         return;
32     }
33     if( str[step]=='T' )///常规操作是转身
34     {
35         dfs(step+1,s-1,x+d,d);///执行操作指令step+1,修改指令后s-1,改成F会走动,方向不变
36         dfs(step+1,s,x,-d);///执行操作指令step+1, 不修改指令,
37     }
38     else
39     {
40         dfs(step+1,s,x+d,d);
41         dfs(step+1,s-1,x,-d);
42     }
43 }
44 
45 int main()
46 {
47     while(cin>>str>>n)/// TF串,F表示前进一格,   T表示转身,但是不走动
48     {
49         ///n表示可以修改指令的次数,一定要修改
50         len=str.size();
51         memset(mp,false,sizeof(mp));
52         ans=-1;
53         dfs(0,n,0,1);///起始方向为正
54         printf("%d\n",ans);
55     }
56     return 0;
57 }

猜你喜欢

转载自www.cnblogs.com/shoulinniao/p/10584699.html