Go: package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
	)

var scanner = bufio.NewScanner(os.Stdin)

func main() {
	for scanner.Scan() {
		buf := strings.Split(scanner.Text(), " ")
		X, _ := strconv.Atoi(buf[0])
		Y, _ := strconv.Atoi(buf[1])
		if X == 0 && Y == 0 {
			break
		}
		tbl := make([][]int, Y+2)
		field := make([][]int, Y+2)
		for i := range field {
			field[i] = make([]int, X+2)
			tbl[i] = make([]int, X+2)
			for j := range field[i] {
				field[i][j] = 2
				tbl[i][j] = 0
			}
		}
		buf_ := make([][]string, Y)
		for i := range buf_ {
			scanner.Scan()
			buf_[i] = strings.Split(scanner.Text(), " ")
		}
		for i := 1; i <= Y; i++ {
			for j := 1; j <= X; j++ {
				field[i][j], _ = strconv.Atoi(buf_[i-1][j-1])
				switch field[i][j] {
				case 0:
					if i == 1 {
						tbl[i][j] = 1 // スタートy=1
					} else {
						if field[i-1][j-1] != 2 {
							tbl[i][j] += tbl[i-1][j-1] // 左上からやってくる
						}
						if field[i-1][j] != 2 {
							tbl[i][j] += tbl[i-1][j] // 真上からやってくる
						}
						if field[i-1][j+1] != 2 {
							tbl[i][j] += tbl[i-1][j+1] // 右上からやってくる
						}
						if field[i-2][j] == 2 {
							tbl[i][j] += tbl[i-2][j] // ジャンプしてくる
						}
					}
				case 1:
					tbl[i][j] = 0 // 障害物あり
				case 2:
					if field[i-1][j] != 2 {
						tbl[i][j] += tbl[i-1][j] // 真上からくる
					}
					if field[i-2][j] == 2 {
						tbl[i][j] += tbl[i-2][j] // ジャンプ台からジャンプしてくる
					}
				}
			}
		}
		sum := 0
		for i := 1; i <= X; i++ {
			sum += tbl[Y][i] // とびこさないでゴール
			if field[Y-1][i] == 2 {
				sum += tbl[Y-1][i] // 飛び越してゴール
			}
		}
		fmt.Println(sum)
	}
}

C++: #include <bits/stdc++.h>

using namespace std;

int field[15][15];
int dp[17][15];

int n, m;

bool isIn(int x, int y){
    return 0 <= x && x < n && 0 <= y && y < m;
}

int main(){
    while(cin >> n >> m, n+m){
        for(int i=0; i < n; i++) for(int j=0; j< m; j++){cin >> field[i][j];}
        for(int i=0; i< 16; i++) for(int j=0; j< 15; j++) dp[i][j] = 0;
        for(int i=0; i < m; i++) dp[0][i] = 1;
        for(int i=0; i < n-1; i++){
            for(int j=0; j < m; j++){
                if(field[i][j] == 0){
                    for(int k=-1; k <= 1; k++){
                        if(isIn(i+1, j+k) && !(k != 0 && field[i+1][j+k] == 2)){
                            dp[i+1][j+k] += dp[i][j];
                        }
                    }
                }
                else if(field[i][j] == 1) dp[i][j] = 0;
                else if(field[i][j] == 2) dp[i+2][j] += dp[i][j];
            }
        }
        for(int i=0; i< m; i++) if(field[n-1][i] != 1)dp[n][i] += dp[n-1][i];
        int count = 0;
        for(int i=0; i< m; i++) count += dp[n][i];
        cout << count << endl;
    }
}

C++: #include<iostream>
using namespace std;
int solve(int x,int y);
int ax,ay;
int mas[200][200];
int memo[200][200];
int main(){
  while(1){
    for(int i=0;i<200;i++){
      for(int j=0;j<200;j++){
	memo[i][j]=0;
      }
    }
    int ans=0;
    cin>>ax>>ay;
    if(ax==0 && ay==0) break;
    
    for(int i=0;i<ay;i++){
      for(int j=0;j<ax;j++){
	cin>>mas[i][j];
      }
    }
    
    for(int i=0;i<ax;i++){
      if(mas[0][i]!=1){
	ans+=solve(i,0);
      }
    }
    cout<<ans<<endl;
  }
}
int solve(int x,int y){
  if(memo[y][x]!=0){
    return memo[y][x];
  }
  else if(y==ay){
    return 1;
  }else if(mas[y][x]==1){
    return 0;
  }else if(mas[y][x]==2){
    return solve(x,y+2);
  } 
  else{
    int anss=0; 
    if(mas[y+1][x]!=1){
      anss+=solve(x,y+1);
    }
    if(x+1<ax && mas[y+1][x+1]==0 && y+1!=ay){
      anss+=solve(x+1,y+1);
    }
    if(0<=x-1 && mas[y+1][x-1]==0 && y+1!=ay){
      anss+=solve(x-1,y+1);
    }
    return memo[y][x]=anss;
  }
}

C++: #include<iostream>
#include<cstring>
using namespace std;

int w,h;
int data[20][20]; //y,x
int memo[20][20]; //y,x

int solve(int y, int x){

  if(x < 0 || y < 0 || x == w || y == h) return 0;
  if(memo[y][x] > 0) return memo[y][x];
  if(data[y][x] == 1) return 0;
  if(data[y][x] == 0 && y == h-1) return 1;
  if(data[y][x] == 2 && (y == h-2 || y == h-1)) return 1;

  if(data[y][x] == 2) return memo[y][x] = solve(y+2,x);

  if(x > 0 && !data[y+1][x-1] && !data[y+1][x+1])
    return memo[y][x] = solve(y+1,x-1) + solve(y+1,x) + solve(y+1,x+1);

  else if(x > 0 && !data[y+1][x-1])
    return memo[y][x] = solve(y+1,x-1) + solve(y+1,x);

  else if(!data[y+1][x+1])
    return memo[y][x] = solve(y+1,x) + solve(y+1,x+1);

  else return memo[y][x] = solve(y+1,x);
}

int main(){

  while(true){
    cin >> w >> h;
    if(!w && !h) break;

    for(int i=0;i<h;i++){
      for(int j=0;j<w;j++) cin >> data[i][j]; //y,x
    }

    int ans = 0;
    for(int i=0;i<w;i++){
      memset(memo,0,sizeof(memo));
      ans += solve(0,i); //y,x
    }

    cout << ans << endl;
  }
}

C++: #include<stdio.h>
int dp[20][20];
int dat[20][20];
int main(){
	int a,b;
	while(scanf("%d%d",&a,&b),a){
		for(int i=0;i<b;i++)
			for(int j=0;j<a;j++)
				scanf("%d",&dat[i][j]);
		for(int i=0;i<20;i++)
			for(int j=0;j<20;j++)dp[i][j]=0;
		for(int i=0;i<a;i++)dp[0][i]=1;
		for(int i=0;i<b;i++){
			for(int j=0;j<a;j++){
				if(dat[i][j]==0){
					if(i<b-1&&j&&dat[i+1][j-1]==0)dp[i+1][j-1]+=dp[i][j];
					if(i<b-1&&j<a-1&&dat[i+1][j+1]==0)dp[i+1][j+1]+=dp[i][j];
					if(dat[i+1][j]!=1)dp[i+1][j]+=dp[i][j];
				}
				if(dat[i][j]==2){
					if(dat[i+2][j]!=1)dp[i+2][j]+=dp[i][j];
				}
			}
		}
		int ret=0;
		for(int i=b;i<20;i++)
			for(int j=0;j<a;j++)
				ret+=dp[i][j];
		printf("%d\n",ret);
	}
}

C++: #include <iostream>
using namespace std;
int w,h;
int mp[20][20],memo[20][20];
int dx[] = {-1,0,1};
void saiki(int x,int y) {
  if(y >= h-1) memo[y][x]++;
  else if(mp[y][x] != 1) {
    for(int i=0;i<3;i++) {
      int nx = x+dx[i], ny = y+1;
      if(nx==x && mp[ny][nx] == 2)while(mp[ny][nx] == 2) ny+=2;
      if(nx <0|| nx >= w ||mp[ny][nx] == 1) continue;

      if(memo[ny][nx]>0&&mp[ny][nx]==0) memo[y][x] += memo[ny][nx];
      else if(mp[ny][nx] == 0){
	saiki(nx,ny);
	memo[y][x] += memo[ny][nx];
      }
    }
    if(memo[y][x] == 0) mp[y][x] = 1;
  }
}
int main() {
  while(1) {
    cin >> w >> h;
    if(w == 0 && h == 0) break;
    for(int i=0;i<=19;i++)
      for(int j=0;j<=19;j++)memo[i][j] = mp[i][j] = 0;
     
    for(int i=0;i<h;i++)
      for(int j=0;j<w;j++)cin >> mp[i][j];
  
    for(int i=0;i<w;i++)
      if(mp[0][i] !=1) saiki(i,0);
     
    int cnt = 0;
    for(int i=0;i<w;i++)cnt+=memo[0][i];
    cout <<cnt<<endl;
  }
  return 0;
}

C++: #include<iostream>
#include<cstdio>

int w,h,i,j,m[16][16],d[16][16];

int f(int x,int y){
	if(~d[y][x])return d[y][x];
	if(m[y][x]==1)return 0;
	if(y>=h)return 1;
	
	int r=0;
	if(!m[y][x]){for(int i=-1;i<2;i++)r+=x+i>0&&x+i<=w&&!(m[y+1][x+i]==2&&i!=0)?f(x+i,y+1):0;return d[y][x]=r;}
	return d[y][x]=f(x,y+2);
}

int main(){
	while(std::cin>>w>>h,w){
		for(i=17;--i;)for(j=17;--j;)d[i][j] = -1;
		for(;i++<h;)for(j=w;j;j--)std::cin >> m[i][j];
		for(int i=w;i;i--)j+=f(i, 1);
		std::cout<<j<<'\n';
	}
}

C++: #include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<map>
#include<cstring>
#include<string>
using namespace std;
int X,Y;
int fie[20][20];
int dp[20][20];
int dx[]={-1,0,1};
int solve(int x,int y){
  if(dp[x][y]!=-1) return dp[x][y];
  if(y>=Y-1) return dp[x][y]=1;
  if(fie[x][y]==2){
    if(fie[x][y+2]!=1)
      return dp[x][y]=solve(x,y+2);
    return dp[x][y]=0;
  }
  int ret=0;
  for(int i=0;i<3;i++){
    int nx=x+dx[i];
    if(nx < 0 || nx >= X) continue;
    if(fie[nx][y+1]==1) continue;	 
    if(i==1){
      ret += solve(nx,y+1);
    }else{
      if(fie[nx][y+1]==2) continue;
      ret += solve(nx,y+1);
    }
  }
  return dp[x][y]=ret;
}
main(){
  while(1){
    cin >> X >> Y;
    if(X==0 && Y==0) break;
    memset(fie,0,sizeof(fie));
    for(int i=0;i<Y;i++)
      for(int j=0;j<X;j++) cin >> fie[j][i];
    memset(dp,-1,sizeof(dp));
    int res=0;
    for(int i=0;i<X;i++){
      if(fie[i][0]==0)
	res += solve(i,0);
    }
    cout << res << endl;
  }
  
}