結果
| 問題 |
No.3 ビットすごろく
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2023-12-15 08:11:42 |
| 言語 | Go (1.23.4) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,332 bytes |
| コンパイル時間 | 16,343 ms |
| コンパイル使用メモリ | 234,380 KB |
| 実行使用メモリ | 5,376 KB |
| 最終ジャッジ日時 | 2024-09-27 06:03:27 |
| 合計ジャッジ時間 | 17,893 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | WA * 33 |
ソースコード
package main
import (
"fmt"
)
func main() {
// ゴール
var n int
fmt.Scan(&n)
// ゴールに到達する最短の移動数
results := make([]int, n+1)
results[1] = 1 // 開始のマスへも移動にカウントすることから
// ゴールが1なら、それがゴール(開始のマスがすでにゴールになっている場合)
if n == 1 {
fmt.Println(0)
return
}
que := []int{1}
visited := make([]bool, n+1)
visited[0] = true
visited[1] = true
for len(que) > 0 {
// キューの先頭を取り出す
i := que[0]
que = que[1:]
fmt.Println("i", i)
bit := countBits(uint(i))
if bit == 0 {
continue
}
// 前に進む
next := i + bit
if next <= n && !visited[next] {
if next != n {
que = append(que, next)
}
visited[next] = true
results[next] = results[i] + 1
}
back := i - bit
if back > 0 && back < n && !visited[back] {
que = append(que, back)
visited[back] = true
results[back] = results[i] + 1
}
}
fmt.Println(results[n])
}
// 数値を2進数に変換した際の'1'の数を返す
func countBits(num uint) int {
count := 0
for num > 0 {
count += int(num & 1) // 最下位ビットを1とAND演算(→ 1であれば1を、0であれば0を返す)
num >>= 1 // 1ビット右にシフト
}
return count
}