#include<stdio.h>

int dx[3] = {-1, 0, 1};
int dy[3] = {1, 1, 1};

int main(void)
{
	int **map, f1, f2, f3, **temp, x, y, sum, px, py;
	
	while(scanf("%d %d", &x, &y) && y > 0)
	{
		map = new int *[y];
		temp = new int *[y];
		sum = 0;

		//マップ土地&動的計画作成
		for(f1 = 0; f1 < y; f1++)
		{
			map[f1] = new int [x];
			temp[f1] = new int [x];
		}
		//マップ構成入力&初期化
		for(f1 = 0; f1 < y; f1++)
		{
			for(f2 = 0; f2 < x; f2++)
			{
				scanf("%d",&map[f1][f2]);
				temp[f1][f2] = 0;
			}
		}
		//最上のスタート地点設定
		for(f1 = 0; f1 < x; f1++)
		{
			if(map[0][f1] != 1)
			{
				temp[0][f1] = 1;
				sum++;
			}
		}
		//探索
		if(y >= 2)
		{
			sum = 0;
			for(f1 = 0; f1 < y - 1; f1++)
			{
				for(f2 = 0; f2 < x; f2++)
				{
					if(map[f1][f2] == 0 && temp[f1][f2] > 0)
					{
						for(f3 = 0; f3 < 3; f3++)
						{
							//移動
							px = f2 + dx[f3];
							py = f1 + dy[f3];
							//範囲内か
							if(px >= 0 && px < x)
							{
								//同じｘ座標からのジャンプ台
								if(f3 == 1 && py < y - 1){
									//ｙ軸2つ先へ
									while(py < y - 1 && map[py][px] == 2)
										py += 2;
								}
								//着地した場所がゴール地点のｙ座標と同じで障害物にぶつかってないか
								//ゴール地点のｙ座標を超えたか
								if(py > y - 1 || py == y - 1 && map[py][px] != 1)
									sum += temp[f1][f2];
								//超えてないが、障害物がない地点に着地したか
								else if(map[py][px] == 0)
									temp[py][px] += temp[f1][f2];
							}
						}
					}
				}
			}
		}
		//出力
		printf("%d\n",sum);
	}

	return 0;
}