牛客网-乌龟跑步-(dfs)
链接:https://ac.nowcoder.com/acm/problem/15294
来源:牛客网
题目描述
有一只乌龟,初始在0的位置向右跑。
这只乌龟会依次接到一串指令,指令T表示向后转,指令F表示向前移动一个单位。乌龟不能忽视任何指令。
现在我们要修改其中正好n个指令(一个指令可以被改多次,一次修改定义为把某一个T变成F或把某一个F变成T)。
求这只乌龟在结束的时候离起点的最远距离。(假设乌龟最后的位置为x,我们想要abs(x)最大,输出最大的abs(x))
这只乌龟会依次接到一串指令,指令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 }