#include <iostream>
using namespace std;
int X,Y;
int fields[20][20];
int dp[20][20];
int counter=0;
int Max(int x,int y){
        return x>y?x:y;
}
int Min(int x,int y){
        return x>y?y:x;
}
int recursion(int y,int x){
        int res=0;
        if(dp[y][x]!=-1)
                return dp[y][x];
        if(y>=Y){
                res=1;
        }
        else if(fields[y][x]==3)
                res=0;
        else if(fields[y][x]==2){
                if(fields[y+2][x]==1)
                        return 0;
                res+=recursion(y+2,x);
        }
        else{
                if(fields[y+1][x]!=1){
                        res+=recursion(y+1,x);
                }
                if(fields[y+1][x-1]==0){
                        res+=recursion(y+1,x-1);
                }
                if(fields[y+1][x+1]==0){
                        res+=recursion(y+1,x+1);
                }
        }
        return dp[y][x]=res;
}
int main(){
        while(true){
                for(int i=0 ; i<20 ; i++ )
                        for(int j=0 ; j<20 ; j++ )
                                dp[i][j]=-1;
                cin >> X >> Y;
                counter=0;
                if(X+Y==0)
                        break;
                for(int i=0 ; i<=X ; i++ ){
                        fields[0][i]=3;
                        fields[Y+1][i]=3;
                }
                for(int i=0 ; i<=Y ; i++ ){
                        fields[i][0]=3;
                        fields[i][X+1]=3;
                }
                for(int i=1 ; i<=Y ; i++ )
                        for(int j=1 ; j<=X ; j++ )
                                cin >> fields[i][j];
                int ans=0;
                for(int i=1 ; i<=X ; i++ ){
                        if(fields[1][i]==1)
                                continue;
                        ans+=recursion(1,i);
                }
                cout << ans << endl;
        }
        return 0;
}