728x90
https://www.acmicpc.net/problem/9019
이 블로그에서 이전에 몇번 다뤄봤던 bfs 문제이다. (최단경로!)
여기서 중요한건 DSLR을 활용한 문자열을 출력해야 한다는 점이다. 이는 기존에 탐색 최소 횟수만을 세는 방식과는
살짝 푸는 아이디어를 달리 해야한다.(큰 아이디어는 같음.)
엄청 대단한건 아니고, 바꾼 상태의 문자를 저장하면서 게임을 진행해야 하기 때문에
벡터에다가 현재 숫자와 문자열을 쌍으로 저장해 둬야 진행하기 수월해지는 문제다.
<소스 코드>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
#include <iostream>
#include <string>
#include <cstring>
#include <queue>
using namespace std;
int A,B;
bool visited[10001];
string bfs(void){
queue<pair<int,string>> q;
q.push(make_pair(A,""));
visited[A] = true;
while(!q.empty()){
int num = q.front().first;
string change = q.front().second;
q.pop();
if(num==B)
return change;
//D
int newNum = (2*num)%10000;
if(!visited[newNum]){
visited[newNum]=true;
q.push(make_pair(newNum,change+"D"));
}
//S
newNum = num==0 ? 9999 : num-1;
if(!visited[newNum]){
visited[newNum]=true;
q.push(make_pair(newNum,change+"S"));
}
//L
int thousand = num/1000;
int hundred = (num-1000*thousand)/100;
int ten = (num-1000*thousand-100*hundred)/10;
int one = (num-1000*thousand-100*hundred-10*ten);
newNum = 1000*hundred + 100*ten + 10*one + 1*thousand;
if(!visited[newNum]){
visited[newNum]=true;
q.push(make_pair(newNum,change+"L"));
}
//R
newNum = 1000*one + 100*thousand + 10*hundred + 1*ten;
if(!visited[newNum]){
visited[newNum]=true;
q.push(make_pair(newNum,change+"R"));
}
}
}
int main(void){
int T;
cin>>T;
for(int i=0; i<T; i++){
memset(visited,false, sizeof(visited));
cin>>A>>B;
cout<<bfs()<<"\n";
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
<
<실행 결과>
'알고리즘 > 백준' 카테고리의 다른 글
백준 2251 물통 : bfs와 브루트포스 - c++ (0) | 2020.01.30 |
---|---|
1525 퍼즐 - bfs와 브루트포스 - c++ (0) | 2020.01.30 |
백준 1963 - 소수경로 - bfs,몫 나머지 활용 - C++ (0) | 2020.01.28 |
백준 1697 숨바꼭질 - bfs - c++ (0) | 2020.01.28 |
백준 10971 - 외판원 순회 2 - dfs 를 이용한 순열 구현 (0) | 2020.01.27 |