アルゴリズム・パズルです。
問題:
上のような規則があります。縦が 5cm、横が 6cm の長方形の場合、A から B までの最長経路は何 cm でしょうか。
Ruby で解いてみました。
q50.rb
W, H = 6, 5 def yoko?(y) @yoko[y].inject(:+) < 2 end def tate?(x) @tate[x].inject(:+) < 2 end def search(x, y, co) if x == W and y == H @max = co if co > @max return end if x < W and yoko?(y) @yoko[y][x] += 1 search(x + 1, y, co + 1) @yoko[y][x] -= 1 end if x > 0 and yoko?(y) @yoko[y][x - 1] += 1 search(x - 1, y, co + 1) @yoko[y][x - 1] -= 1 end if y < H and tate?(x) @tate[x][y] += 1 search(x, y + 1, co + 1) @tate[x][y] -= 1 end if y > 0 and tate?(x) @tate[x][y - 1] += 1 search(x, y - 1, co + 1) @tate[x][y - 1] -= 1 end end @tate = Array.new(W + 1) {Array.new(H, 0)} @yoko = Array.new(H + 1) {Array.new(W, 0)} @max = 0 search(0, 0, 0) puts @max #=>25
25 cm が答えです。自分の環境で 3.1 秒かかりました。ループの回数は 1513353 回です。
解法はごく素直に、再帰を使った深さ優先探索です。
ルートは全部で 805通りあります。すべての画像を出力するコードはこちら。 Gem 'cairo' を使っています。下は GIF化(参照)した画像です。
プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問
- 作者: 増井敏克
- 出版社/メーカー: 翔泳社
- 発売日: 2015/10/16
- メディア: Kindle版
- この商品を含むブログ (8件) を見る