#include<iostream>
//#include
using namespace std;

struct P{
	int way;
	int stt;
};

//グローバルは土俵F、と配列ans

P F[17][17];
//はじめにF.wayを-1で初期化 端っこ.sttを1で初期化

int ans[1000]={0};
int counter=0,flag=0;

int solve(int x,int y);

int jump(int x,int y){
	if(F[x][y-2].stt==2)
		return (F[x][y-2].way==-1) ? solve(x,y-2) : F[x][y-2].way;
	else return 0;
}

int left(int x,int y){
	if(F[x-1][y-1].stt==0) 
		return (F[x-1][y-1].way==-1) ? solve(x-1,y-1) : F[x-1][y-1].way;
	else return 0;
}

int right(int x,int y){
	if(F[x+1][y-1].stt==0) 
		return (F[x+1][y-1].way==-1) ? solve(x+1,y-1) : F[x+1][y-1].way;
	else return 0;
}

int samex(int x,int y){
	if(F[x][y-1].stt==0) 
		return (F[x][y-1].way==-1) ? solve(x,y-1) : F[x][y-1].way;
	else return 0;
}

int solve(int x,int y){//入力した座標までのコース数を返す 0は普通 1は障害物 2はジャンプ台
	if (y==1) return 1;
	if (F[x][y].stt==0)
	return jump(x,y)+left(x,y)+right(x,y)+samex(x,y);
	if (F[x][y].stt==2)
	return jump(x,y)+samex(x,y);
	if (F[x][y].stt==1)
	return 0;
	return 0;
}

//int solve_ex(int x,int y){//最後JUMP通過のとき jumpをそのまま使う


void solver(){
	int X,Y;
	cin >> X >> Y;
	if(X==0) {flag=1;return;}
	
	
	for(int i=0;i<17;i++){
		for(int j=0;j<17;j++){
			F[i][j].way=-1;
			F[i][j].stt=1;
		}
	}
	
	for(int i=1;i<=Y;i++){
		for(int j=1;j<=X;j++){
			cin >> F[j][i].stt;
		}
	}
	
	for(int x=1;x<=X;x++){
		ans[counter]+=(solve(x,Y)+jump(x,Y+1));
	}
	counter++;
}

int main(){
	while(flag==0){
		solver();
	}
	
	for(int i=0;i<counter;i++){
		cout << ans[i]<<"\n";
	}
}