문자열로 쉽게 풀릴거 같은 예감.
익숙한 입질...이건...도망쳐!
R에서 n/1000이 아니라는 걸 몰랐다면 못 풀었겠지.
DSLR 변수를 따로 만들지 말고 하나의 배열의 저장하면 더욱 빠르다.
// 1928ms
for _ in 0..<Int(readLine()!)! {
let p = readLine()!.split(separator: " ").map {Int(String($0))!}
let (a,b) = (p[0],p[1])
var visited = [Bool](repeating: false, count: 10000)
var q = [(a,0)]
var index = 0
loop: while true {
let n = q[index].0
let cmd = q[index].1
index += 1
let next = [
0,
n*2%10000,
n==0 ? 9999 : n-1,
n*10%10000+n/1000,
n%10*1000+n/10
]
for i in 1...4 {
if next[i] == b {
var result = ""
for i in String(cmd*10+i) {
switch i {
case "1" : result += "D"
case "2" : result += "S"
case "3" : result += "L"
default: result += "R"
}
}
print(result)
break loop
}
if !visited[next[i]] {
visited[next[i]] = true
q.append((next[i], cmd*10 + i))
}
}
}}
// 4960ms
let t = Int(readLine()!)!
let mod = 10000
for _ in 0..<t {
let p = readLine()!.split(separator: " ").map{Int(String($0))!}
let (a,b) = (p[0],p[1])
var visited = [Bool](repeating: false, count: 10000)
var q = [(a,"")]
var index = 0
while index < q.count {
let n = q[index].0
let cmd = q[index].1
index += 1
if n == b {
print(cmd)
break
}
let d = n*2 % mod
let s = n==0 ? 9999 : n-1
let l = n%1000*10 + n/1000
let r = n%10*1000 + n/10
if !visited[d] {
visited[d] = true
q.append((d, cmd+"D"))
}
if !visited[s] {
visited[s] = true
q.append((s, cmd+"S"))
}
if !visited[l] {
visited[l] = true
q.append((l, cmd+"L"))
}
if !visited[r] {
visited[r] = true
q.append((r, cmd+"R"))
}
}
}
// 함수로 빼면 시간초과
// func check(_ num:Int,_ cmd:String,_ new:String) {
// if !visited[num] {
// visited[num] = true
// q.append((num, cmd + new))
// }
// }
질문창에 cdg0228님
URL에 비공개 단어가 포함되어 있다.