結果
| 問題 | No.3 ビットすごろく |
| コンテスト | |
| ユーザー |
tsuchinaga
|
| 提出日時 | 2019-03-09 01:21:09 |
| 言語 | Go (1.23.4) |
| 結果 |
AC
|
| 実行時間 | 8 ms / 5,000 ms |
| コード長 | 927 bytes |
| コンパイル時間 | 14,115 ms |
| コンパイル使用メモリ | 229,820 KB |
| 実行使用メモリ | 5,376 KB |
| 最終ジャッジ日時 | 2024-07-01 09:15:15 |
| 合計ジャッジ時間 | 14,915 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 33 |
ソースコード
package main
import (
"fmt"
"strings"
)
func main() {
var n int
_, _ = fmt.Scan(&n)
dest := make(map[int][]int, 0) // あるマスから行ける移動先
for i := 1; i <= n; i++ {
b := strings.Count(fmt.Sprintf("%b", i), "1")
d := make([]int, 0)
if i+b <= n {
d = append(d, i+b)
}
if i-b >= 1 {
d = append(d, i-b)
}
dest[i] = d
}
// fmt.Println(dest)
type Node struct {
n, depth int
}
stack := []Node{{1, 1}}
// 幅優先で最初に見つかった答えが最短
ans := -1
for {
if len(stack) == 0 { // 探索し終えた
break
}
p := stack[0] // 現在地
if p.n == n {
ans = p.depth
break
}
stack = stack[1:] // pop
for _, d := range dest[p.n] {
if _, ok := dest[d]; ok {
stack = append(stack, Node{d, p.depth + 1})
}
}
// 一度通ったところはdestから消す
delete(dest, p.n)
// fmt.Println(p, stack, dest)
}
fmt.Println(ans)
}
tsuchinaga