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 JAVA (judge verdict: Wrong Answer)

import java.util.*;
public class Main {
	static Scanner sc = new Scanner(System.in);
	static int x, y;
	static int[][] field, dp;
	static int[] dx = {-1, 0, 1}, dy = {1};
	public static void main(String[] args) {
		while(read()){
			solve();
		}
	}
	
	static boolean read(){
		x = sc.nextInt();
		y = sc.nextInt();
		if(x == 0 && y == 0)return false;
		
		field = new int[y+2][x];
		dp = new int[y+2][x];
		
		for(int i = 0; i < field.length-2; i++){
			for(int j = 0; j < field[0].length; j++){
				field[i][j] = sc.nextInt();
			}
		}
		return true;
	}
	
	static void solve(){
		for(int i = 0; i < field[0].length; i++){
			if(field[0][i] == 0)dp[0][i] = 1;
		}
		
		for(int y = 0; y < field.length-3; y++){
			for(int x = 0; x < field[0].length; x++){
				if(field[y][x] == 0){
					for(int k = 0; k < dx.length; k++){
						int nx = x + dx[k], ny = y + 1;
						if(0 > nx || nx >= field[0].length)continue;
						if(field[ny][nx] == 0)dp[ny][nx] += dp[y][x];
					}
				}else if(field[y][x] == 2){
					int ny = y + 2, nx = x;
					while(true){
						dp[ny][nx] += dp[y-1][x];
						if(field[ny][nx] != 2)break;
						ny = ny + 2;
					}
				}else if(field[y][x] == 1){
					dp[y][x] = 0;
				}
			}
		}
		int res = 0;
		for(int x = 0; x < dp[0].length; x++){
			res += dp[dp.length-1][x] + dp[dp.length-2][x] + dp[dp.length-3][x];
		}
		System.out.println(res);
		//printDP();
	}
	
	static void printDP(){
		for(int i = 0; i < field.length; i++){
			for(int j = 0; j < field[0].length; j++){
				System.out.print(dp[i][j] + " ");
			}
			System.out.println();
		}
	}
}