Your car starts at position 0 and speed +1 on an infinite number line. (Your car can go into negative positions.)
Your car drives automatically according to a sequence of instructions A (accelerate) and R (reverse).
When you get an instruction "A", your car does the following: position += speed, speed *= 2
.
When you get an instruction "R", your car does the following: if your speed is positive then speed = -1
, otherwise speed = 1
. (Your position stays the same.)
For example, after commands "AAR", your car goes to positions 0->1->3->3, and your speed goes to 1->2->4->-1.
Now for some target position, say the lengthof the shortest sequence of instructions to get there.
Example 1: Input: target = 3 Output: 2 Explanation: The shortest instruction sequence is "AA". Your position goes from 0->1->3.
Example 2: Input: target = 6 Output: 5 Explanation: The shortest instruction sequence is "AAARA". Your position goes from 0->1->3->7->7->6.
解题思路:
这是一道很明显的BFS的题目了,但是需要进行一些剪枝,不然最后一些例子无法通过 ;
class Solution {
public:
int racecar(int target)
{
int res = 0 ;
unordered_set<string> visited = {"0,1"} ;
queue<pair<long , long>> q;
q.push({0,1}) ;
while(!q.empty())
{
for(int i = q.size() - 1 ; i >= 0 ; --i)
{
long pos = q.front().first , spe = q.front().second ;
q.pop() ;
if(pos == target) return res ;
long new_pos = 0, new_spe = 0 ;
string s = "" ;
new_pos = pos + spe ;
new_spe = spe * 2 ;
s = to_string(new_pos) + "," + to_string(new_spe) ;
if(new_pos >= 0 && new_pos < target * 2 && !visited.count(s))
{
q.push({new_pos , new_spe}) ;
visited.insert(s) ;
}
new_pos = pos ;
new_spe = spe > 0 ? -1 : 1 ;
s = to_string(new_pos) + "," + to_string(new_spe) ;
if(new_pos >= 0 && new_pos < target * 2 && !visited.count(s)) // 当new_pos >= target * 2时就不用将其放置队列中
{
q.push({new_pos , new_spe}) ;
visited.insert(s) ;
}
}
res++ ;
}
return -1 ;
}
};
这道题还有动态规划的做法,想了半天,不会。。先mark吧 ;
来源:https://blog.csdn.net/cmy203/article/details/100079679