-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path13913.java
More file actions
116 lines (98 loc) · 2.32 KB
/
13913.java
File metadata and controls
116 lines (98 loc) · 2.32 KB
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
package algo;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;
import java.util.StringTokenizer;
public class Main {
public static void main(String args[]) throws IOException {
new Task().run();
}
static class Task {
private int N,K;
private int[] pos;
private StringTokenizer st = null;
private BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
private BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
private StringTokenizer getStringTokenizer() throws IOException {
return new StringTokenizer(br.readLine(), " ");
}
private void init() {
pos = new int[100001];
for(int i=0; i<=100000; i++) {
pos[i] = -1;
}
}
private void input() throws IOException {
st = getStringTokenizer();
N = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());
init();
}
private boolean checkArea(int x) {
return x>=0 && x<=100000;
}
private void bfs() throws IOException {
Queue<int[]> q = new LinkedList();
int[] init = {N,0};
pos[N] = N;
q.add(init);
while(!q.isEmpty()) {
int[] cur = q.poll();
int x = cur[0];
int time = cur[1];
if(x==K) {
System.out.println(time);
break;
}
if(checkArea(x+1) && pos[x+1] == -1) {
pos[x+1] = x;
int[] next = {x+1, time+1};
q.add(next);
}
if(checkArea(x-1) && pos[x-1] == -1) {
pos[x-1] = x;
int[] next = {x-1, time+1};
q.add(next);
}
if(checkArea(x*2) && pos[x*2] == -1) {
pos[x*2] = x;
int[] next = {x*2, time+1};
q.add(next);
}
}
if(N==K) {
System.out.println(N);
} else {
Stack<Integer> s = new Stack();
s.push(K);
int idx = K;
while(true) {
if(pos[idx] == N) {
s.push(N);
break;
}
s.push(pos[idx]);
idx = pos[idx];
}
while(!s.isEmpty()) {
System.out.print(s.pop() + " ");
}
}
}
public void run() throws IOException {
input();
bfs();
close();
}
private void close() throws IOException {
bw.close();
br.close();
}
}
}