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<cstdio>
#include<iostream>
#include<vector>
#include<algorithm>
#include<map>
#include<set>
#include<queue>
#include<string>

using namespace std;

#define rep(i,n) for(int i=0;i<int(n);i++)
#define reps(i,n) for(int i=1;i<=int(n);i++)
#define sint(i) scanf("%d",&i);
#define sintt(i,j) scanf("%d%d",&i,&j);
#define sinttt(i,j,k) scanf("%d%d%d",&i,&j,&k);
#define sintttt(i,j,k,m) scanf("%d%d%d%d",&i,&j,&k,&m);

#define INF 1010000000
int dx[]={1,0,-1,0};
int dy[]={0,1,0,-1};



int main(){
	while(1){
		int n,m;
		sintt(n,m);
		if(n==0)break;
		int masu[17][17];
		int dp[17][17];
		
		rep(i,17)rep(j,17)masu[i][j]=dp[i][j]=0;
		
		rep(i,m)rep(j,n){
			sint(masu[j+1][i]);
		}
		
		reps(j,n){
			if(masu[j][0]!=1){
				dp[j][0]=1;
			}
		}
		
		rep(i,m-1){
			reps(j,n){
				if(masu[j][i]==1){
					dp[i][j]=0;
					continue;
				}
				if(masu[j][i]==2){
					if(masu[j][i+2]!=1){
						dp[j][i+2]+=dp[j][i];
					}
					continue;
				}
				if(masu[j][i]==0){
					if(masu[j-1][i+1]==0){
						dp[j-1][i+1]+=dp[j][i];
					}
					if(masu[j+1][i+1]==0){
						dp[j+1][i+1]+=dp[j][i];
					}
					
					if(masu[j][i+1]!=1){
						dp[j][i+1]+=dp[j][i];
					}
				}
			}
		}
		
		int ans=0;
		for(int i=m-1;i<=m;i++){
			reps(j,n){
				ans+=dp[j][i];
			}
		}
		printf("%d\n",ans);
		
		rep(i,m+2){
			rep(j,n+2){
				printf("%d ",dp[j][i]);
			}puts("");
		}
	}
}

C++: #include<iostream>
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);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<cstring>
using namespace std;

int dp[17][17];
int map[17][17];
int y,x;

long long int check(int i,int j)
{
  if(j>=x||j<0)
    return 0;
  if(i>=y)
    return 1;

  if(map[i][j]==1)
    return 0;

  if(dp[i][j]!=-1)
    return dp[i][j];

  long long int sum=0; 
  if(i>=y-1)
    sum=1;
  else if(map[i][j]==2)
    sum=check(i+2,j);
  else
    {
      if(j-1>=0 && map[i+1][j-1]==0)
	sum+=check(i+1,j-1);
      sum+=check(i+1,j);
      if(j+1<x && map[i+1][j+1]==0)
	sum+=check(i+1,j+1);
    }
    

  // cout<<i<<" "<<j<<" " <<sum<<endl;
  dp[i][j]=sum;
  return sum;
}

int main()
{
  for(;cin>>x>>y,x;)
    {
      memset(dp,-1,sizeof(dp));
      memset(map,0,sizeof(map));
      for(int i=0;i<y;i++)
	for(int j=0;j<x;j++)
	  {
	    cin>>map[i][j];
	  }
      long long int ans=0;
      for(int i=0;i<x;i++)
	ans+=check(0,i);
      cout<<ans<<endl;
    }
}

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++;
  // cout << x <<" "<<y <<endl;
  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(x == nx && memo[ny][nx] == 2 && memo[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)saiki(nx,ty);
	if(memo[ty][nx] > 0) memo[y][x] += 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);
    }
    
    /*    for(int i=0;i<h;i++) {
    for(int j=0;j<w;j++) 
      cout << memo[i][j]<<" ";
    cout << endl;
    } */
    
  
    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>
#include<vector>
#include<cstdio>
#include<cstring>
using namespace std;

#define REP(i,n) for(int i=0;i<(int)(n);++i)
typedef long long Int;

int a[20][20];
int dp[20][20];

int main() {
  for (;;) {
      memset(dp, 0, sizeof(dp));
      memset(a, 0, sizeof(a));
      int C, R; cin >> C >> R;
      if ((C | R) == 0) break;
      REP(r, R) REP(c, C) cin >> a[r][c];


      REP(c, C) if (a[0][c] == 0) dp[0][c] = 1;
      REP(r, R - 1) {
          REP(c, C) if (a[r][c] == 0) {
              if (c - 1 >= 0) dp[r + 1][c - 1] += dp[r][c];
              if (c + 1 <  C) dp[r + 1][c + 1] += dp[r][c];
              if (a[r + 1][c] == 2) {
                  int d = 1;
                  while (a[r + d][c] == 2) d += 2;
                  dp[r + d][c] += dp[r][c];
              }
              else
                  dp[r + 1][c] += dp[r][c];
          }
      }

      Int ans = 0;
      REP(c, C) {
          if (a[R - 1][c] == 0) ans += dp[R - 1][c];
          if (a[R][c] == 0) ans += dp[R][c];
      }

      cout << ans << endl;

  }
  return 0;
}