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<cstring>
#include<algorithm>
using namespace std;

int main(){

  int x,y;
  int a[100][100];
  int w[100][100];

  while(true){
    cin >> x >> y;
    if(!x && !y) break;

    memset(w,0,sizeof(w));
    int ans = 0;

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

    for(int i=0;i<x;i++){
      if(a[0][i] == 0) w[0][i] = 1;
    }

    for(int i=1;i<y;i++){
      for(int j=0;j<x;j++){

	if(a[i][j] == 1) w[i][j] += 0;

	else if(a[i][j] == 2){
	  w[i][j] += 0;
	  w[i+2][j] += w[i-1][j];
	}

	else if(a[i][j] == 0){
	  if(i-3 > 0 && (a[i-3][j+1] == 2 || a[i-3][j-1] == 2)) w[i][j] += w[i-1][j];
	  else if(j-1 < 0) w[i][j] += w[i-1][j] + w[i-1][j+1];
	  else if(j+1 == y) w[i][j] += w[i-1][j-1] + w[i-1][j];
	  else w[i][j] += w[i-1][j-1] + w[i-1][j] + w[i-1][j+1];
	}


      }

    }

    for(int i=0;i<x;i++) ans += w[y-1][i] + w[y][i] + w[y+1][i];
    cout << ans << endl;

  }
}

C++: #include <iostream>
#define N 15
using namespace std;
int jump(int,int);
int X,Y,data[N][N],dp[N][N];
int main(){
  bool q[N][N];
  while(1){
    cin >> X >> Y;
    if(X==0&&Y==0) break;
    for(int i=0;i<Y;i++)
      for(int j=0;j<X;j++) cin >> data[i][j],q[i][j]=false,dp[i][j]=0;
    for(int i=0;i<X;i++)
      if(data[0][i]==0) q[0][i]=true,dp[0][i]=1;
    for(int i=0;i<Y-1;i++){
      for(int j=0;j<X;j++){
	if(q[i][j]==true){
	  if(0<=j-1&&data[i+1][j-1]==0) dp[i+1][j-1]+=dp[i][j],q[i+1][j-1]=true;
	  if(j+1<X&&data[i+1][j+1]==0) dp[i+1][j+1]+=dp[i][j],q[i+1][j+1]=true;
	  if(data[i+1][j]==0) dp[i+1][j]+=dp[i][j],q[i+1][j]=true;
	  else if(data[i+1][j]==2){
	    int r=jump(i+1,j);
	    if(r==-1) dp[Y-1][j]+=dp[i][j];
	    else if(r!=-2) dp[r][j]+=dp[i][j],q[r][j]=true;
	  }
	}
      }
    }
    int cnt=0;
    for(int i=0;i<X;i++) cnt+=dp[Y-1][i];
    cout << cnt << endl;
  }
  return 0;
}
int jump(int y,int x){
  while(1){
    y+=2;
    if(y<Y&&data[y][x]==1) break;
    if(y>=Y-1) return -1;
    if(data[y][x]==0) return y;
  }
  return -2;
}

C++: #include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int X,Y;
int f[20][20];
int dp[20][20];
int d[3]={1,0,-1};
int main()
{
	while(1)
	{
		int ans=0;
		memset(dp,0,sizeof(dp));
		memset(f,0,sizeof(f));
		scanf("%d %d",&Y,&X);
		if(X==0&&Y==0)break;
		for(int i=0;i<X;i++)
		{
			for(int j=0;j<Y;j++)
			{
				scanf("%d",&f[i][j]);
			}
		}
		for(int i=0;i<Y;i++)
		{
			if(f[0][i]==0)dp[0][i]=1;
			else dp[0][i]=0;
		}
		for(int i=0;i<X-1;i++)
		{
			for(int j=0;j<Y;j++)
			{
				if(f[i][j]==0)
				{
					for(int k=0;k<3;k++)
					{
						if(j+d[k]<0||j+d[k]>=Y)continue;
						if(f[i+1][j+d[k]]==2&&d[k]!=0)continue;
						//if(j==Y-1&&d[k]!=0)continue;
						dp[i+1][j+d[k]]+=dp[i][j];
					}
				}
				else if(f[i][j]==2)
				{
					dp[i+2][j]+=dp[i][j];
				}
			}
		}
		/*cout << endl;
		for(int i=0;i<=X+1;i++)
		{
			for(int j=0;j<Y;j++)
			{
				cout << dp[i][j] << ' ';
			}
			cout << endl;
		}*/
		for(int i=X-1;i<=X;i++)
		{
			for(int j=0;j<Y;j++)if(f[i][j]!=1)
			{
				ans+=dp[i][j];
			}
		}
		printf("%d\n",ans);
	}
	return 0;
}

C++: #include <iostream>

using namespace std;

int gole, X, Y;
int map[15][15];

bool check(int x, int y, int flag) { // flag: ツ陳シツ進ツつオツづつォツつスツつゥ
	if (x < 0 || x >= X) return false;
	if (y >= Y) { gole += flag; return false; }
	if (map[y][x] == 1) return false;
	if (!flag && map[y][x] == 2) return false;
	return true;
}

int main() {
	while (cin >> X >> Y, X || Y) {
		int pattern[15][15] = {0};
		gole = 0;
		for (int y = 0; y < Y; ++y)
			for (int x = 0; x < X; ++x)
				cin >> map[y][x];

		for (int x = 0; x < X; ++x)
			if (map[0][x] == 0)
				pattern[0][x] = 1;

		for (int y = 1; y < Y; ++y)
			for (int x = 0; x < X; ++x) {
				if (map[y-1][x] == 0) {
					if (check(x-1, y, false)) pattern[y][x-1] += pattern[y-1][x];
					if (check(x,   y, true))  pattern[y][x]   += pattern[y-1][x];
					if (check(x+1, y, false)) pattern[y][x+1] += pattern[y-1][x];
				}
				else if (map[y-1][x] == 1) continue;
				else if (check(x, y+1, pattern[y-1][x])) pattern[y+1][x] += pattern[y-1][x];
			};

		for (int x = 0; x < X; ++x) gole += pattern[Y-1][x];

		cout << gole << endl;
	}
	return 0;
}

C++: #include <iostream>
#define N 15
using namespace std;
int data[N][N];
void func(int,int);
int Cnt(int,int);
int X,Y,cnt;
int main(){
  while(1){
    cin >> X >> Y;
    if(X==0&&Y==0) break;
    for(int i=0;i<Y;i++)
      for(int j=0;j<X;j++)
	cin >> data[i][j];
    cnt=0;
    for(int i=0;i<X;i++){
      if(data[0][i]==0) func(0,i);
    }
    cout << cnt << endl;
  }
  return 0;
}
void func(int y,int x){
  if(y>=Y-1){
    cnt++;
    return;
  }
  if(y+1<Y&&x+1<X&&data[y+1][x+1]==0) func(y+1,x+1);
  if(y+1<Y&&x-1>=0&&data[y+1][x-1]==0) func(y+1,x-1);
  if(y+1<Y&&data[y+1][x]==2){
    int r=Cnt(y,x);
    if(r!=-1) func(r,x);
    else return ;
  }
  if(y+1<Y&&data[y+1][x]==0) func(y+1,x);
}
int Cnt(int y,int x){
  y+=3;
  while(1){
    if(y>=Y-1){
      if(y>Y-1) cnt++;
      else if(y==Y-1&&data[y][x]!=1) cnt++;
      break;
    }
    if(data[y][x]==1) break;
    if(data[y][x]==2) y+=2;
    if(data[y][x]==0) return y;
  }
  return -1;
}