Upgrade to Pro — share decks privately, control downloads, hide ads and more …

BrainPad プログラミングコンテスト 2025 (AHC046)writer解法の復習

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for thunder thunder
June 19, 2025
360

BrainPad プログラミングコンテスト 2025 (AHC046)writer解法の復習

BrainPadプログラミングコンテスト2025 開催記念LT会に向けた資料

Avatar for thunder

thunder

June 19, 2025
Tweet

Transcript

  1. BFS 2/2 12 移動・滑走のBFS ・滑走を入れても同じようにBFSで 現在地から各マスへの最短距離がわかる 1ターン 1 1 1

    ... 全体 2ターン 1 1 1 1 1 2 2 2 2 2 2 2 1 1 2 2 2 2 2 1 1 1 1 2 2 2 2 2 2 2 1 2 2 2 2 2 3 3 3 3 3
  2. ビット並列化 1/10 13 bitboard ・マス数が64個以内のグリッド上のBFSは、1個の64bit整数で処理できる 65マス以上でも、c++ならstd::bitset<N>を使えばNbitぶんのビット演算ができる 盤面 今の位置 0b00000,00000,00000,10000,00000 1

    壁なし 0b11111,11111,11111,11110,01111 右移動 今の位置<<1 0b00000,00000,00001,0000,00000 1 左移動 今の位置>>1 0b00000,00000,00000,01000,00000 1 下移動 今の位置<<幅 0b00000,00000,10000,00000,00000 1 上移動 今の位置>>幅 0b00000,00000,00000,10000 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
  3. ビット並列化 2/10 14 1マス移動 ・右移動は左端以外を埋めたビット列とのANDをとり、盤面外移動禁止を表現 (左移動は右端以外を埋めたビット列) 盤面 今の位置 0b00000,00000,00000,10000,00000 1

    壁なし 0b11111,11111,11111,11110,01111 右移動 今の位置<<1 0b00000,00000,00001,0000,00000 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 左端以外を埋めたビット列 0b11110,11110,11110,11110,11110 1 1 1 1 1 & 0b00000,00000,00000,0000,00000 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
  4. ビット並列化 3/10 15 1マス移動 ・壁のない位置とANDをとることで、壁への侵入禁止を表現 右移動 今の位置<<1 & 壁なし 0b00000,00000,00000,00000,00000

    左移動 今の位置>>1 & 壁なし 0b00000,00000,00000,01000,00000 下移動 今の位置<<幅 & 壁なし 0b00000,00000,10000,00000,00000 上移動 今の位置>>幅& 壁なし 0b00000,00000,00000,00000 壁なし 0b11111,11111,11111,11110,01111 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 盤面 1 1 今の位置 0b00000,00000,00000,10000,00000 1
  5. ビット並列化 4/10 16 1マス移動 ・1マス移動については4方向の移動をORで次のターンの全候補が表現できる 4方向移動 & 壁なし 0b00000,00000,10000,01000,00000 今の位置

    | 4方向移動 0b00000,00000,10000,11000,00000 壁なし 0b11111,11111,11111,11110,01111 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 盤面 1 今の位置 0b00000,00000,00000,10000,00000 1 1 1 1 1
  6. ビット並列化 5/10 17 滑走 ・滑走は移動演算の繰り返しで表現してみる 左移動 1回 盤面 今の位置 1

    左移動 2回 左移動 3回 左移動 4回 1 1 1 1 1 1 1 1 1 1 1 求めたいもの 1 1
  7. ビット並列化 7/10 19 滑走 ・1マス左動を試すたびに、逆方向シフトの反転とのANDをとる。 これで、ブロックや盤外で止まったビットを特定できる 1 1 1 左移動

    1回 今の位置 1 1 1 1 ~ (左移動 << 1) 今の位置 & ~(左移動<<1) 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 左移動 1回 << 1 1 1 1 逆方向 シフト 反転 たっているビットがない。 左移動1回ではどのビットも 止まらないことがわかる。
  8. ビット並列化 8/10 20 滑走 ・1マス左動を試すたびに、逆方向シフトの反転とのANDをとる。 これで、ブロックや盤外で止まったビットを特定できる 1 1 左移動 3回

    左移動2回 1 1 1 1 ~ (左移動3回 << 1) 左移動2回 & ~(左移動3回<<1) 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 左移動 3回 << 1 1 1 逆方向 シフト 反転 止まったビットだけ 特定できる 1 1
  9. ビット並列化 10/10 22 移動+滑走 ・1マス移動4方向と滑走4方向で得られるbitを徐々にORしていけば、 各マスに何ターンで移動できるかわかる 盤面 初期 1 2ターン後

    1ターン後 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3ターン後 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3ターン後 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
  10. 焼きなまし 8/8 30 ブロック時間変更近傍 ・ブロックのために追加した仮の目標を訪れるタイミングを全目標間から ランダムに選んで変更 仮想目的地と ブロックを選択 1 3

    2 4 0.1 0.1 b 仮想目的地に行く タイミングを変更 1 3 2 4 3.1 3.1 b 図解上、 3と4の間に行く仮想目的地を 小数で表現しているが、 実装上は配列の入れ替えで表現