假设我们有一辆汽车,它在无穷编号线上的位置0开始,速度+1。赛车会按照以下说明自动运行:A:加速,R-反向。当我们收到指令“ A”时,我们的汽车将执行以下操作:
位置:=位置+速度,然后速度=速度* 2。
当我们收到指令“ R”时,我们的汽车将执行以下操作:
如果速度为正,则速度= -1,
否则速度= 1。
例如,执行完“ AAR”指令后,我们的汽车将转到位置0-> 1-> 3-> 3,速度将变为1-> 2-> 4->-1。
现在假设我们有一些目标位置。我们必须找到最短指令序列的长度才能到达那里。
因此,如果输入类似于target = 6,则输出将为5,因为可能的序列之一是AAARA,位置序列将为0-> 1-> 3-> 7-> 7-> 6
为了解决这个问题,我们将遵循以下步骤-
定义一组参观
定义一个队列q
将{0,1}插入q
对于初始化级别:= 0,如果非q为空,则更新(将级别增加1),执行-
定义一对curr:= q的前元素,从q删除元素
如果第一个与目标相同,则-
前进:=当前第一个+当前第二个
forwardSpeed:=当前秒* 2
键:=将正向转换为字符串并置“ *”将并转正向速度转换为字符串
如果正向> 0且|正向-目标| <没有访问目标和非键,则-
key:=将curr的第一个转换为字符串连接“ *”,当curr的第二个> 0时连接0,否则为-1
如果curr.first> 0并且| target-curr.first | <未访问目标和键,则-
回报水平
将键插入已访问
将{forward,forwardSpeed}插入q
将键插入已访问
将{curr.first(如果curr.second> 0,然后是-1,否则为1})插入q
对于初始化k:= q的大小,当k> 0时,更新(将k减1),执行-
返回-1
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h> using namespace std; class Solution { public: int racecar(int target) { unordered_set < string > visited; queue < pair <int ,int> > q; q. push({0, 1}); for(int level = 0; !q.empty(); level++){ for(int k = q.size(); k > 0; k-- ){ pair <int, int> curr = q.front(); q.pop(); if(curr.first == target) return level; int forward = curr.first + curr.second; int forwardSpeed = curr.second * 2; string key = to_string(forward) + "*" + to_string(forwardSpeed); if(forward > 0 && abs(forward - target) < target && !visited.count(key)){ visited.insert(key); q.push({forward, forwardSpeed}); } key = to_string(curr.first) + "*" + to_string(curr.second > 0 ? - 1: 1); if(curr.first > 0 && abs(target - curr.first) < target && !visited.count(key)){ visited.insert(key); q.push({curr.first, curr.second > 0 ? - 1: 1}); } } } return -1; } }; main(){ Solution ob; cout << (ob.racecar(6)); }
6
输出结果
5