สมมติว่าเรามีรถที่เริ่มต้นที่ตำแหน่ง 0 และความเร็ว +1 บนเส้นจำนวนอนันต์ รถวิ่งโดยอัตโนมัติตามลำดับคำสั่ง A:สำหรับการเร่งความเร็วและ R – สำหรับการถอยหลัง เมื่อเราได้รับคำสั่ง "A" รถของเราจะทำสิ่งต่อไปนี้ -
- ตำแหน่ง :=ตำแหน่ง + ความเร็ว จากนั้น ความเร็ว =ความเร็ว * 2.
เมื่อเราได้รับคำสั่ง "R" รถของเราจะทำสิ่งต่อไปนี้ -
- ถ้าความเร็วเป็นบวก ความเร็ว =-1
- มิฉะนั้น ความเร็ว =1.
ตัวอย่างเช่น หลังจากทำตามคำแนะนำ "AAR" รถของเราไปที่ตำแหน่ง 0->1->3->3 และความเร็วไปที่ 1->2->4->-1
สมมติว่าเรามีตำแหน่งเป้าหมายอยู่บ้าง เราต้องหาความยาวของลำดับคำสั่งที่สั้นที่สุดเพื่อไปที่นั่น
ดังนั้น ถ้าอินพุตเหมือนเป้าหมาย =6 เอาต์พุตจะเป็น 5 เนื่องจากหนึ่งในลำดับที่เป็นไปได้คือ AAARA ลำดับตำแหน่งจะเป็น 0->1->3->7->7->6
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- กำหนดการเยี่ยมชมหนึ่งชุด
- กำหนดหนึ่งคิว q
- แทรก { 0, 1 } ลงใน q
- สำหรับระดับเริ่มต้น:=0 เมื่อไม่มี q ว่างเปล่า ให้อัปเดต (เพิ่มระดับขึ้น 1) ทำ −
- สำหรับการเริ่มต้น k :=ขนาดของ q เมื่อ k> 0, อัปเดต (ลด k ลง 1) ทำ −
- กำหนดหนึ่งคู่ curr :=องค์ประกอบด้านหน้าของ q ลบองค์ประกอบออกจาก q
- ถ้าตัวแรกของเคอร์เท่ากับเป้าหมาย −
- ระดับผลตอบแทน
- forward :=อันดับแรกของสกุลเงิน + วินาทีของสกุลเงิน
- forwardSpeed :=วินาทีของสกุลเงิน * 2
- key :=convert forward to string concatenate " * " concatenate convert forwardSpeed to string
- ถ้าส่งต่อ> 0 และ |forward - target|
- ใส่คีย์เข้าไป
- แทรก { forward, forwardSpeed } ลงใน q
- key :=แปลงค่าแรกของ curr เป็น string concatenate " * " concatenate 0 เมื่อวินาทีของ curr> 0 มิฉะนั้น -1
- ถ้า curr.first> 0 และ |target - curr.first| <เป้าหมายและคีย์ไม่อยู่ในการเยี่ยมชม −
- ใส่คีย์เข้าไป
- แทรก { curr.first, (ถ้า curr.second> 0 แล้ว -1 มิฉะนั้น 1 }) ลงใน q
- สำหรับการเริ่มต้น k :=ขนาดของ q เมื่อ k> 0, อัปเดต (ลด k ลง 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