急がば回れ(Ruby)

アルゴリズム・パズルです。
 

問題:
20180214012431
上のような規則があります。縦が 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化(参照)した画像です。