위치 0에서 시작하여 무한 수선에서 속도가 +1인 자동차가 있다고 가정합니다. 자동차는 일련의 지침 A:가속 및 R - 후진에 따라 자동으로 실행됩니다. 지시 "A"를 받으면 우리 차는 다음을 수행합니다 -
- 위치 :=위치 + 속도, 그 다음 속도 =속도 * 2.
명령 "R"을 받으면 우리 차는 다음을 수행합니다. -
- 속도가 양수이면 속도 =-1,
- 그렇지 않으면 속도 =1입니다.
예를 들어, "AAR" 명령을 실행한 후 우리 차는 위치 0->1->3->3으로 이동하고 속도는 1->2->4->-1로 이동합니다.
이제 목표 위치가 있다고 가정합니다. 거기에 도달하려면 가장 짧은 명령어 시퀀스의 길이를 찾아야 합니다.
따라서 입력이 target =6과 같으면 가능한 시퀀스 중 하나가 AAARA이고 위치 시퀀스는 0->1->3->7->7->6
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
- 방문 한 세트 정의
- 하나의 대기열 q 정의
- q에 { 0, 1 } 삽입
- 초기화 레벨의 경우:=0, q가 비어 있지 않은 경우 업데이트(레벨 1 증가), 수행 -
- 초기화 k의 경우:=q의 크기, k> 0일 때 업데이트(k를 1만큼 감소), 수행 -
- 한 쌍의 curr 정의:=q의 앞 요소, q에서 요소 삭제
- curr의 첫 번째가 target과 같으면 -
- 반환 수준
- forward :=curr의 첫 번째 + curr의 두 번째
- forwardSpeed :=현재의 초 * 2
- key :=문자열로 순방향 변환 연결 " * " 연결 forwardSpeed를 문자열로 연결
- 앞으로> 0 및 |앞으로 - 대상|
- 방문한 항목에 키 삽입
- q에 { forward, forwardSpeed } 삽입
- key :=첫 번째 curr을 문자열로 변환 concatenate " * "는 두 번째 curr> 0일 때 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