visit
거리는 항상 1 이상이기 때문에 -1일 경우 방문을 하지 않은걸로 처리하면 두 배열을 합쳐서 표현이 가능하다.
O(V+E)
v: 정점
E: 간선
from[정점] : 어디에서 왔는지
N에서 K를 간다고 한다면
N 부터 from을 통해서 N까지 가야한다.
즉, 역순으로 저장되기 때문에, 다시 역순으로 구하는 것이 필요하다.
방법 1. 재귀 함수를 구현해서 from을 역추적한다.
방법 2. 반복문을 사용하여 k->n 으로 갈 때까지 반복시킨다.(스택 사용)
BFS는 가중치가 1일 때 해결할 수 있지만, 덱을 사용하면 0,1일 때 사용할 수 있다.
val br = BufferedReader(InputStreamReader(System.`in`))
val q = ArrayDeque<Int>()
val token = StringTokenizer(br.readLine())
val n = token.nextToken().toInt()
val k = token.nextToken().toInt()
val d = Array<Int>(2*maxOf(n,k,10)){
-1
}
val MAX = 2*k
q.add(n)
d[n] = 0
while(!q.isEmpty()){
val now = q.removeFirst()
if(now + 1 < MAX){
if(d[now+1] == -1) {
q.add(now + 1)
d[now + 1] = d[now] + 1
}
}
if(now - 1 >= 0){
if(d[now-1] == -1) {
q.add(now - 1)
d[now - 1] = d[now] + 1
}
}
if(now * 2 < MAX){
if(d[now*2] == -1) {
q.add(now*2)
d[now*2] = d[now] + 1
}
}
}
print(d[k])
val br = BufferedReader(InputStreamReader(System.`in`))
val q = ArrayDeque<Int>()
val token = StringTokenizer(br.readLine())
val n = token.nextToken().toInt()
val k = token.nextToken().toInt()
val d = Array<Int>(2*maxOf(n,k,10)){
-1
}
val from = Array<Int>(2*maxOf(n,k,10)){
0
}
val MAX = 2*k
q.add(n)
d[n] = 0
while(!q.isEmpty()){
val now = q.removeFirst()
if(now + 1 < MAX){
if(d[now+1] == -1) {
q.add(now + 1)
d[now + 1] = d[now] + 1
from[now + 1] = now
}
}
if(now - 1 >= 0){
if(d[now-1] == -1) {
q.add(now - 1)
d[now - 1] = d[now] + 1
from[now-1] = now
}
}
if(now * 2 < MAX){
if(d[now*2] == -1) {
q.add(now*2)
d[now*2] = d[now] + 1
from[now*2] = now
}
}
}
val stc = Stack<Int>()
println(d[k])
var temp:Int = k
stc.push(k)
repeat(d[k]){
temp = from[temp]
stc.push(temp)
}
while(!stc.isEmpty()){
print("${stc.pop()} ")
}
val br = BufferedReader(InputStreamReader(System.`in`))
val token = StringTokenizer(br.readLine())
val n = token.nextToken().toInt()
val k = token.nextToken().toInt()
val d = Array(200001){
-1
}
d[n] = 0
val q = ArrayDeque<Int>()
val MAX = 200001
q.add(n)
while(!q.isEmpty()){
val now = q.removeFirst()
// 0초 걸리는걸 우선으로 방문해야함
// *2 칸
if(now*2 < MAX) {
if (d[now * 2] == -1) {
d[now * 2] = d[now]
q.addFirst(now * 2)
}
}
// -1 칸
if(now - 1 >= 0){
if(d[now-1] == -1){
d[now-1] = d[now] + 1
q.add(now-1)
}
}
// 1 칸
if(now + 1 < MAX){
if(d[now+1] == -1){
d[now+1] = d[now] + 1
q.add(now+1)
}
}
}
print(d[k])