Problem:
Problem F: Line Puzzle

プログラミングでパズルを解いてみよう。

n × n の数字が格子状に並んでいる。数字のいくつかは丸で囲まれており、これらを起点と呼ぶことにする。パズルのルールは以下のとおりである：

各起点から縦・横に進む１本の線を引く（斜めには引けない）。

通った数字の和が起点の数字と同じになるように線を伸ばす。

線は枝分かれしてはいけない。

線はすでに引かれた数字を通ることはできない（線は交差してはいけない）。

線は２個以上の起点を通ることはできない。

下図に示すように、パズルのゴールはすべての起点を使い、すべての数字に線を引くことである。

あなたの仕事は、パズルを解くプログラムを作成することである。
ただしこの問題では、与えられたパズルが解けるものかどうかを判定するだけでよい。

Input

入力は複数のデータセットからなる。各データセットの形式は以下のとおりである：

n
n × n の数字

n × n の数字が与えられるパズルを示し、起点の数字は負の数として与えられる。

n が 0 のとき入力の終わりを示す。

n は 3 以上 8 以下、起点以外の数字は 1 以上 50 以下、起点は -50 以上 -1 以下であると仮定してよい。また、入力されるパズルの性質として以下のことを仮定してよい：

与えられるパズルの各行、各列には最低でも１つの起点がある。

起点の個数は、全体の数字の個数 (n × n) の 20 % から 40 % 程度である。

Output

各データセットに対して、パズルが解けるものであれば "YES" を、そうでなければ "NO" と１行に出力せよ。

Sample Input

3
-3 1 1
2 -4 1
2 1 -1
3
-4 1 1
1 1 -6
1 -5 3
4
-8 6 -2 1
2 -7 -2 1
1 -1 1 1
1 1 1 -5
6
2 2 3 -7 3 2
1 -10 1 1 3 2
2 6 5 2 -6 1
3 4 -23 2 2 5
3 3 -6 2 3 7
-7 2 3 2 -5 -13
6
2 2 3 -7 3 2
1 -10 1 1 3 2
2 6 5 2 -6 1
3 4 -23 2 2 5
3 3 -6 2 3 7
-7 2 3 2 -5 -12
0

Output for the Sample Input

YES
NO
NO
YES
NO

Solution in Ruby (judge verdict: Time Limit Exceeded)

Add = [[0, 1], [0, -1], [1, 0], [-1, 0]]

def dfs(map, y, x, cost)
  return [map] if cost.zero?
  result = Array.new
  Add.each do |(dy, dx)|
    ny = y + dy
    nx = x + dx
    next if ny < 0 || map.size <= ny
    next if nx < 0 || map.size <= nx
    next if map[ny][nx] <= 0
    next if cost < map[ny][nx]
    nm = map.dup.map(&:dup)
    nm[ny][nx] = 0
    nc = cost - map[ny][nx]
    result += dfs(nm, ny, nx, nc)
  end
  result
end

until (n = gets.to_i).zero?
  puzzle = Array.new
  n.times do puzzle.push(gets.split.map(&:to_i)) end

  queue = [puzzle.dup.map(&:dup)]
  (0...n).each do |i|
    (0...n).each do |j|
      next if puzzle[i][j] >= 0
      result = Array.new
      queue.each do |q|
        q[i][j] = 0
        result += dfs(q, i, j, -puzzle[i][j])
      end
      queue = result
    end
  end

  result = false
  queue.each do |q|
    ok = true
    q.each do |line|
      ok = false unless line.all?(&:zero?)
    end
    result = true if ok
  end
  puts result ? "YES" : "NO"
end