#include<stdio.h>
#include<iostream>
#include<queue>

#define N 15

using namespace std;


int map[N][N];
int paturn[N][N];
queue<int> que;

void printarray(int X,int Y){
  for(int i=0;i<Y;i++){
    for(int j=0;j<X;j++){
      cout << map[i][j];
    }
    cout << endl;
  }
  return;
}


long long int bfs(int X,int Y){
  int cost[N][N];
  long long int cnt=0;
  int dx[3]={-1,0,1};
  int nx;

  for(int i=0;i<Y;i++){//初期化
    for(int j=0;j<X;j++){
      cost[i][j]=0;
    }
  }
  for(int i=0;i<Y;i++){//コスト初期値設定
    for(int j=0;j<X;j++){
      if(map[0][j]==0){
        cost[0][j]=1;
      }
    }
  }


  for(int i=1;i<Y;i++){
    for(int j=0;j<X;j++){

      if(map[i][j]==2){//この列にジャンプ台あれば
        cost[i][j]=cost[i-1][j];
      }

      for(int k=0;k<3;k++){
        nx=j+dx[k];
        if((0<=nx)&&(nx<X)){//範囲外参照防止

          if(map[i][j]==0){//マップのでいう今の位置に障害物なければ
            if(map[i-1][nx]==0){//一つ上の列各列に何もない
              cost[i][j]=cost[i][j]+cost[i-1][nx];
            }
          }
        }
      }

      if(i>=3){//深さ３以上で
        if(map[i-2][j]==2){//２マス上の位置にジャンプ台あれば
          cost[i][j]=cost[i][j]+cost[i-2][j];
        }
      }
      /*
      if(map[i][j]==2){
        if((i>=3)&&(map[i-2][j]==2)){
          cost[i][j]=cost[i][j]+cost[i-2][j];
        }

      }

    */
    }
  }

  printf("\n");
  for(int i=0;i<Y;i++){
    for(int j=0;j<X;j++){
      printf("%d ", cost[i][j]);
    }
    printf("\n");
  }

  for(int i=0;i<X;i++){//一番下の列を加算
    cnt=cnt+cost[Y-1][i];
    if(map[Y-2][i]==2){
      cnt=cnt+cost[Y-2][i];
    }
  }

  return cnt;
}

int main(){

  int x,y;
  long long int ans;

  cin >> x >> y;

  while((x!=0)&&(y!=0)){

    for(int i=0;i<y;i++){//データセット取得.動作正常
      for(int j=0;j<x;j++){
        cin >> map[i][j];//データセット入力
        paturn[i][j]=0;//paturn配列に初期値設定
      }
    }

    ans=bfs(x,y);

    cout << ans << endl;

    for(int i=0;i<y;i++){//mapの初期化.動作正常
      for(int j=0;j<x;j++){
        map[i][j]=0;
      }
    }

    ans=0;

    cin >> x >> y;//次のｘ、ｙの取得
  }

  return 0;
}