nf-oj|机器人 (rabot)
为什么叫 rabot 啊,英语真好。
机器人robot(rabot)
描述
南海区机器人比赛即将开始,该比赛的的规则如下:
1、将机器人摆放在数轴0的位置。
2、机器人只能向左或向右走,
3、参赛选手可以编写指令:
现在笑笑写了一串指令准备去参赛,由于笑笑有很强的计算能力,他可以马上知道机器人最后会走到哪里。为了难倒笑笑,他的好朋友酷酷就说,现在让你修改其中
输入
第一行一个字符串
接下来一行一个整数
输出
共一行,一个正整数,表示离起点(位置
输入样例 1
FFFTFFF
2
输出样例 1
6
提示
思路
这一题看着就没有好一点的思路,这时候可以看看数据范围。只有 100 / 50 。非常的小。
数学方法想不到,其实从题面,可以想到 dp ,搜索。
搜索
题目的变量给的挺清楚的,有当前执行命令( cnt ),方向( d ),走的距离( p ),要执行的指令( q )。
即可对这四个状态进行搜索。
先判断边界:
- 当
时( >len 时统计答案 ),return ;
统计答案 :
记忆化: 将状态都存到 vis 里面
dfs:
-
对当前的用两次指令,剩下的不变;
-
当前为 T/F 的话,各有两种情况,在代码里面看吧;
挺好理解的其实。
主要的细节即:距离可能为负数,将方向标为 1/-1 时候会有负数;
记得加一个偏移量。
代码
// written by yfz
// dfs
#include<bits/stdc++.h>
using namespace std;
char str[111];
int vis[111][211][55][3];
int n,ans,len;
void dfs(int cnt,int p,int q,int d) {
//当前执行第 cnt 个指令 当前距离为 p 当前使用第 q 个指令 当前的方向 d(1/-1)
if(q>n||cnt>len+1) return;//越界返回
if(cnt>len&&q==n) {//统计答案
ans=max(ans,abs(p));
return ;
}
if(vis[cnt][p+100][q][d+1]) return;//记忆化返回 && 记忆化
vis[cnt][p+100][q][d+1]=1;
dfs(cnt,p,q+2,d);
if(str[cnt]=='F') {// F 的情况
dfs(cnt+1,p+d,q,d);
dfs(cnt+1,p,q+1,-d);
}
if(str[cnt]=='T') {// T 的情况
dfs(cnt+1,p,q,-d);
dfs(cnt+1,p+d,q+1,d);
}
}
int main() {
cin>>str+1;
cin>>n;
len=strlen(str+1);
dfs(1,0,0,1);
cout<<ans;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现