#include <iostream>
#include <algorithm>

const int MAPSIZE = 20;

using namespace std;

void p(int (*a)[MAPSIZE], int size = MAPSIZE){
	for(int i = 0; i < size; i++){
		for(int j = 0; j < size; j++){
			cout << a[i][j];
		}
		cout << endl;
	}
}

int main(){
	int mapdata[MAPSIZE][MAPSIZE];
	int route[MAPSIZE][MAPSIZE];

	int x, y;
	while(true){
		cin >> x >> y;
		if(!x && !y) break;

		fill((int*)mapdata, (int*)(mapdata + sizeof(mapdata)/sizeof(*(mapdata))), 1);

		for(int i = 1; i <= y; i++){
			for(int j = 1; j <= x; j++){
				cin >> mapdata[i][j];
			}
		}

		fill((int*)route, (int*)(route + sizeof(route)/sizeof(*(route))), 0);

		// 下からルート数を入れていく
		for(int i = y; i >= 0; i--){
			for(int j = 1; j <= x; j++){
				switch(mapdata[i][j]){
				case 0: // 移動可能 => ( x-1 , y+1 )、 ( x , y+1 )、 ( x+1 , y+1 ) の経路数値合計（斜めは移動可能マスのみ加算）
					// 但し、i == yの時は1
					if(i == y){
						route[i][j] = 1;
					}
					else{
						route[i][j] = route[i+1][j-1]*(!mapdata[i+1][j-1]) + route[i+1][j] + route[i+1][j+1]*(!mapdata[i+1][j+1]);
					}
					break;
				case 1:// 障害物 => 0
					route[i][j] = 0;
					break;
				case 2:// ジャンプ台=> (x,y+2) の経路数
					// 但し、i+1 >= y のときは1
					if(i+1 >= y){
						route[i][j] = 1;
					}else{
						route[i][j] = route[i+2][j];
					}
					break;
				}
			}
		}
//		p(route, x+3);
		int sum = 0;
		for(int i = 1; i <= x; i++){
			sum += route[1][i];
		}
		cout << sum << endl;
	}

	return 0;
}