Problem:
会津山スキー場の新企画

会津山スキー場の経営者である油木屋さんは、上級者向けとして障害物やジャンプ台を配置したコースを用意しました。コースにはいろいろな滑り方があり、シーズン中に全てのパターンの滑り方が出来た利用者には、プレゼントを贈ることになっています。

油木屋さんのために、コースの見取り図をもとに滑り方のパターン数を出力するプログラムを作ってあげましょう。

コースは上図のような X × Y 個のマスからなるグリッドで表されます。左上を原点とし、x 座標は右に行くにつれて大きくなり、y 座標は下にいくにつれて大きくなるものとします。

各滑り方のパターンは、最も高いところ(y = 1 、ただし障害物の無いところ) からスタートし、ゴール(y = Y) に向かって進んでいきます。グリッドのマス(x, y) にいる滑走者は、(x − 1, y + 1)、(x, y + 1)、 (x + 1, y + 1) のいずれかに移動することができます。マスには、障害物やジャンプ台があり、障害物のあるマスには進入できず、ジャンプ台があるマスに進入すると(x, y + 2) へ移動します。ただし、いちばん高いマス (y = 1 のマス) にはジャンプ台は存在せず、ジャンプ台のあるマスに進入する際には x 座標が同じマスからしか進入できません。コースの上端(y = 1) からスタートし、コースからはずれることなく下端を超えれば(y ≥ Y) 1つの滑り方とみなし、滑り終わります。

コースの情報を入力とし、滑り方の総数を出力するプログラムを作成してください。

Input

複数のデータセットの並びが入力として与えられます。入力の終わりはゼロふたつの行で示されます。各データセットは以下の形式で与えられます。

X Y
c11 c21 ... cX1
c12 c22 ... cX2
:
c1Y c2Y ... cXY

1 行目にコースの大きさX, Y (1 ≤ X, Y ≤ 15) が与えられます。続く Y 行にコースの情報が与えられます。cij (0 , 1 , 2 のいずれか) はx = i, y = j のマスの情報を表す整数で、0 が移動可能なマス、1 が障害物があるマス、2 がジャンプ台があるマスを表します。

データセットの数は 50 を超えません。

Output

入力データセットごとに、コースの滑り方のパターン数を1行に出力します。

Sample Input

5 5
0 0 0 0 1
2 1 0 2 0
1 0 0 1 1
0 2 1 2 0
0 1 0 0 0
5 5
0 0 1 0 0
2 1 0 2 0
1 0 0 1 1
0 2 1 2 0
0 1 0 0 0
15 15
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0

Output for the Sample Input

8
6
52694573

Solution in JavaScript (judge verdict: Accepted)

function main() {
  var
  i = 0, j, y, x,
  xy, cells, answers = {},
  dummy = [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2];
  for (;;) {
    xy = input[i++].split(' ').map(parseFloat);
    cells = [];
    if (xy[0] === 0 && xy[1] === 0) break;
    
    for (j = 0; j < xy[1]; j++) {
      cells.push(input[i++].split(' ').map(parseFloat));
    }
    cells.push(dummy);
    
    answer = 0;
    answers = {};
    for (x = 0; x < xy[0]; x++) answers[[x, 0]] = cells[0][x] === 0 ? 1 : 0;
    for (y = 0; y < xy[1]; y++) {
      for (x = 0; x < xy[0]; x++) {
        answers[[x, y]] = answers[[x, y]] || 0;
        switch (cells[y][x]) {
        case 0:
          if (cells[y + 1][x - 1] !== 2) answers[[x - 1, y + 1]] = (answers[[x - 1, y + 1]] || 0) + answers[[x, y]];
          answers[[x, y + 1]] = (answers[[x, y + 1]] || 0) + answers[[x, y]];
          if (cells[y + 1][x + 1] !== 2) answers[[x + 1, y + 1]] = (answers[[x + 1, y + 1]] || 0) + answers[[x, y]];
          break;
        case 1:
          break;
        case 2:
          answers[[x, y + 2]] = (answers[[x, y + 2]] || 0) + answers[[x, y]];
          break;
        }
      }
    }

//    show(xy, answers);

    for (y = xy[1]; y <= xy[1] + 1; y++) {
      for(x = 0; x < xy[0]; x++) {
        answer += answers[[x, y]] || 0;
      }
    }

    console.log(answer);
  }
}


function show(xy, answers) {
  var
  x, y, line;
  for (y = 0; y <= xy[1]; y++) {
    line = [];
    for (x = 0; x < xy[0]; x++) {
      line.push(answers[[x, y]] || 0);
    }
    console.log(line.join(' '));
  }
}


var
input = '';

process.stdin.resume();
process.stdin.setEncoding('utf8');
process.stdin.on('data', function(chunk) {
  input += chunk;
});
process.stdin.on('end', function() {
  input = input.split('\n');
  main();
});