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<iostream>
#include<vector>

int memo[20][20];
int x, y;

int calc(std::vector<std::vector<int> > &v, int x, int y){

	int res = 0;
	if (memo[x][y] != -1)return memo[x][y];
	if ((x > v.size() - 1) || (x == v.size() - 1 && v[x][y] != 1))return 1;

	if (v[x][y] == 2)res += calc(v, x + 2, y);

	if (v[x][y] == 0){
		if (v[x + 1][y] == 0 || v[x + 1][y] == 2)res += calc(v, x + 1, y);

		if (y < v[x].size() - 1 && v[x + 1][y + 1] == 0)res += calc(v, x + 1, y + 1);

		if (y > 0 && v[x + 1][y - 1] == 0)res += calc(v, x + 1, y - 1);
	}

	return memo[x][y] = res;
}


int main(){

	while (std::cin >> x >> y){

		if (x == 0 && y == 0)break;

		int res = 0;
		std::vector<std::vector<int> >v(y, std::vector<int>(x));

		for (int i = 0; i < 20; i++){
			for (int j = 0; j < 20; j++){
				memo[i][j] = -1;
			}
		}

		for (int i = 0; i < y; i++){
			for (int j = 0; j < x; j++){
				std::cin >> v[i][j];
			}
		}

		for (int i = 0; i < v[0].size(); i++)res += calc(v, 0, i);

		std::cout << res << std::endl;
	}
	return 0;
}

C++: #include <iostream>
using namespace std;
int w,h;
int mp[20][20];
int memo[20][20];
int ans;
int count;
 
int saiki(int x,int y) {
  count++;
  int dx[3] = {-1,0,1};
  int dy[3] = {1,1,1};
   
  if(y >= h-1) ans++,memo[y][x]++;
  else if(mp[y][x] != 1) {
    for(int i=0;i<3;i++) {
      int nx = dx[i]+x;
      int ny = dy[i]+y;
      if(nx <0|| nx >= w || memo[ny][nx] == -1||mp[ny][nx] == 1) continue;
       
      if(memo[ny][nx] > 0 && mp[ny][nx] == 0) {
	ans += memo[ny][nx];
	memo[y][x] += memo[ny][nx];
      } 
      else if(mp[ny][nx] == 0){
	saiki(nx,ny);
	if(memo[ny][nx] > 0) memo[y][x] += memo[ny][nx];
      }
      else if(nx==x && mp[ny][nx] == 2){
	int ty = ny;
	while(mp[ty][nx] == 2) ty+=2;
	if(mp[ty][nx] == 0 && memo[ty][nx] == 0){
	  saiki(nx,ty);
	  if(memo[ty][nx] > 0) memo[y][x] += memo[ty][nx];
	}
	else if(mp[ty][nx] == 0 && memo[ty][nx] > 0){
	  memo[y][x] += memo[ty][nx];
	  ans+= memo[ty][nx];
	}
      }
    }
    if(memo[y][x] == 0) memo[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] = 0;
	mp[i][j] = 0;
      }
     
    for(int i=0;i<h;i++)
      for(int j=0;j<w;j++)
	cin >> mp[i][j];
 
 
    ans = 0;
    count = 0;
    for(int i=0;i<w;i++) {
      if(mp[0][i] !=1) saiki(i,0);
    }
    int ans2 = 0;
    for(int i=0;i<w;i++)
      if(memo[0][i] > 0) ans2+=memo[0][i];
     
    //cout << ans << endl;
       cout << ans2 << endl;
    //cout << count << endl;
  }
 
  return 0;
}

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

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

int main()
{
	int X,Y;
	while(cin >> X >> Y, (X||Y))
	{
		int f[15][17]={0}, dp[15][17]={0};
		for(int i=0; i<Y; i++)
		for(int j=0; j<X; j++)
			cin >> f[j][i];
			
		for(int i=0; i<X; i++)
			if(f[i][0]==0) dp[i][0]=1;
			
		for(int i=0; i<Y-1; i++)
		for(int j=0; j<X; j++)
		{
			if(dp[j][i]==0) continue;
			if(f[j][i]==2)
			{
				int ty=i+2;
				if(f[j][ty]!=1)
					dp[j][ty]+=dp[j][i];
				
				continue;
			}
			
			for(int k=0; k<3; k++)
			{
				int tx=j+dx[k];
				if(tx<0||tx>=X) continue;
				if(f[tx][i+1]==1) continue;
				if(k!=1&&f[tx][i+1]==2) continue;
				
				dp[tx][i+1]+=dp[j][i];
			}
		}
		
		int ans=0;
		for(int j=-1; j<2; j++)
		for(int i=0; i<X; i++)
			ans+=dp[i][Y+j];
			
		cout << ans << endl;
	}
}

C++: #include <iostream>
using namespace std;
int main(){
  while(1){
    int w,h,mp[20][20]={},dp[20][20] ={};
    cin >> w >> h;
    if(w==0 && h==0) break;
    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]==0)dp[0][i] = 1;

    int ans=0;    
    for(int i=0;i<h-1;i++)
      for(int j=0;j<w;j++) {
	if(mp[i][j] !=0) break;
	for(int k=-1;k<=1;k++){
	  int nx=j+k,ny=i+1;
	  if(nx<0||nx>=w) continue;
	  while(k==0 && mp[ny][nx]==2) ny+=2;
	  if(mp[ny][nx]!=0) continue;
	  dp[ny][nx]+= dp[i][j];
	  if(i >= h-1) ans+=dp[i][j];
	}
      }
    cout << ans <<endl;
  }
  return 0;
}

C++: #include <stdio.h>

int main(void){
	int x,y,i,j;
	while(scanf("%d%d",&x,&y),x,y){
		int masu[20][20]={ 0 };
		int dp[20][20]={0};
		int ans=0;
		for(i=1;i<=y;i++){
			for(j=1;j<=x;j++){
				scanf("%d",&masu[i][j]);
			}
		}
		for(i=0;i<=y;i++)masu[i][0]=1;
		for(j=0;j<=x;j++)masu[0][j]=1;
		
		for(j=1;j<=x;j++){
			if(masu[1][j]==0)dp[1][j]=1;
		}
		for(i=2;i<=y;i++){
			for(j=1;j<=x;j++){
				if(masu[i][j]==0){
					if(masu[i-1][j-1]==0)dp[i][j]+=dp[i-1][j-1];
					if(masu[i-1][j]==0)	 dp[i][j]+=dp[i-1][j];
					if(masu[i-1][j+1]==0)dp[i][j]+=dp[i-1][j+1];
					if(masu[i-2][j]==2){
						dp[i][j]+=dp[i-2][j];
					}
				}
				if(masu[i][j]==1){
					dp[i][j]=0;
				}
				if(masu[i][j]==2){
					if(masu[i-1][j]==0)dp[i][j]=dp[i-1][j];
					if(masu[i-2][j]==2)dp[i][j]+=dp[i-2][j];
				}
			}
		}
		/*
		for(i=1;i<=y;i++){
			for(j=1;j<=x;j++){
				printf("%d",dp[i][j]);
			}
			puts("");
		}
		*/
		for(i=1;i<=x;i++){
			ans+=dp[y][i];
			if(masu[y-1][i]==2)ans+=dp[y-1][i];
		}
		
		printf("%d\n",ans);
	}
	
	return 0;
}

C++: #include<iostream>
using namespace std;
int X,Y;
int dp[20][20];
char maps[20][20];
int bun(int x,int y);
int dx[3]={-1,0,1};
main(){
  while(1){
    cin>>X>>Y;
    if(X==0&&Y==0){
      break;
    }
    for(int i=1;i<=Y;i++){
      for(int j=1;j<=X;j++){
    cin>>maps[i][j];
    dp[i][j]=0;
      }
    }
    int ans=0;
    for(int i=1;i<=X;i++){
      if(maps[1][i]!='1'){
    ans+=bun(1,i);
      }
    }
    cout<<ans<<endl;
  }
}
int bun(int y,int x){
  if(y>=Y){
    return 1;
  }
  else if(dp[y][x]!=0){
    return dp[y][x];
  }
  else if(maps[y][x]=='2'){
    if(maps[y+2][x]!='1'){
      return dp[y][x]=bun(y+2,x);
    }
    else{
      return 0;
    }
  }
  else if(maps[y][x]=='1'){
    return 0;
  }
  else{
    int anss=0;
    for(int i=0;i<3;i++){
      int nx=x+dx[i];
      if(i!=1){
    if(nx>0&&nx<=X&&maps[y+1][nx]=='0'){
      anss+=bun(y+1,nx);
    }
      }
      else{
    if(maps[y+1][nx]!='1'){
      anss+=bun(y+1,nx);
    }
      }
    }
    return dp[y][x]=anss;
  }       
}