Problem:
Problem B: 平安京ウォーキング

平安京は、道が格子状になっている町として知られている。

平安京に住んでいるねこのホクサイは、パトロールのために毎日自宅から町はずれの秘密の場所まで行かなければならない。しかし、毎日同じ道を通るのは飽きるし、後を付けられる危険もあるので、ホクサイはできるだけ毎日異なる経路を使いたい。その一方で、ホクサイは面倒臭がりなので、目的地から遠ざかるような道は通りたくない。

平安京のあちこちの道にはマタタビが落ちていて、ホクサイはマタタビが落ちている道を通ることができない。そのような道を通るとめろめろになってしまうからである。幸いなことに、交差点にはマタタビは落ちていない。

ホクサイは、自宅から秘密の場所までの可能な経路の数を知りたい。ここで、ホクサイの自宅は (0, 0) にあり、秘密の場所は(gx, gy)にある。道は x = i (i は整数), y = j (j は整数) に格子状に敷かれている。

Input

入力の1行目には、秘密の場所の座標 (gx, gy) が与えられる。これらはいずれも1以上15以下の整数で、空白1個で区切られて与えられる。 2行目にはマタタビが落ちている区間の数 p (0 ≤ p ≤ 100) が与えられ、続くp行にはマタタビが落ちている区間が1行に1区間ずつ与えられる。 p個の区間は互いに異なる。 1区間は x1 y1 x2 y2 の形で表され、(x1, y1) と (x2, y2) を端点とする、x軸またはy軸に平行な長さ1の線分である。 x1, x2 は [0, gx] の範囲にあり、y1, y2 は [0, gy] の範囲にある。

Output

可能な経路の数を出力せよ。可能な経路が1つもない場合は "Miserable Hokusai!" と1行に出力せよ。

Notes on Submission

上記形式で複数のデータセットが与えられます。入力データの 1 行目にデータセットの数が与えられます。各データセットに対する出力を上記形式で順番に出力するプログラムを作成して下さい。

Sample Input

4
2 2
0
1 1
2
0 0 0 1
0 0 1 0
4 3
4
1 0 0 0
3 3 4 3
4 1 4 0
0 2 0 3
15 15
0

Output for the Sample Input

6
Miserable Hokusai!
5
155117520

Solution in Ruby (judge verdict: Accepted)

# 情報数理科学演習?
# 2014 冬

def heian_kyoWalking()
  gx, gy = gets.split.map(&:to_i) # 秘密の場所の座標
  n = gets.to_i                   # マタタビの区間の数
  matatabiPathes = []

  n.times do
    matatabiPathes << gets.split.map(&:to_i)
  end

  # 平安京の道: 1 ... 通行可能. 0 ... マタタビ.
  # 縦横別の配列を用意。添字は道の出発点の座標。
  heiankyoRow    = Array.new(16).map{ Array.new(15, 1) }
  heiankyoColumn = Array.new(15).map{ Array.new(16, 1) }

  # 平安京の交差点: 交差点までの経路の総数
  heiankyoCross = Array.new(16).map{ Array.new(16, 0) }

  # マタタビのおいてある道に0を代入
  matatabiPathes.each do |x| # x: x1 y1 x2 y2
    a, b, c, d = x
    minx = [a, c].min # 道の端点の座標のうち、
    miny = [b, d].min # 出発点 = 小さい方を用いる。
    if a == c # 縦の道
      heiankyoColumn[miny][minx] = 0
    else      # 横の道
      heiankyoRow[miny][minx] = 0
    end
  end

  # まず、外周の交差点の値を初期化する.外周の交差点への経路の総数は、マタタビがなければすべて1.
  # y = 0 の座標の交差点
  0.upto(14) do |i|
    # マタタビが見つかった場合、それ以降は中止
    heiankyoRow[0][i].zero? ? break : heiankyoCross[0][i+1] = 1
  end

  # x = 0 の座標の交差点
  0.upto(14) do |i|
    # マタタビが見つかった場合、それ以降は中止
    heiankyoColumn[i][0].zero? ? break : heiankyoCross[i+1][0] = 1
  end

  # 中の交差点
  1.upto(gy) do |y|
    1.upto(gx) do |x|
      if heiankyoRow[y][x-1].zero?
      # 交差点にはたどり着けない。
        if heiankyoColumn[y-1][x].zero?  
          heiankyoCross[y][x] = 0
      # 交差点には縦の道からのみ行ける
        else
          heiankyoCross[y][x] = heiankyoCross[y-1][x]
        end
      # 交差点には横の道からのみ行ける
      elsif heiankyoColumn[y-1][x].zero?
        heiankyoCross[y][x] = heiankyoCross[y][x-1]
      # 縦横両方の道から行ける
      else
        heiankyoCross[y][x] += heiankyoCross[y][x-1] + heiankyoCross[y-1][x]
      end
    end
  end

  puts (heiankyoCross[gy][gx].zero? ? "Miserable Hokusai!" : heiankyoCross[gy][gx].to_s)
end

if __FILE__ == $0
  gets.to_i.times{ heian_kyoWalking }
end