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>
#define FOR(i,a,b) for(int i=(a);i<(b);i++)
#define RFOR(i,a,b) for(int i=(b) - 1;i>=(a);i--)
#define REP(i,n) for(int i=0;i<(n);i++)
#define RREP(i,n) for(int i=n-1;i>=0;i--)

#define PB push_back
#define INF INT_MAX/3
#define ALL(a) (a).begin(),(a).end()
#define CLR(a) memset(a,0,sizeof(a))

typedef long long int ll;

using namespace std;
int dp[20][20];

int saiki(vector< vector<int> > &m,int x,int y){
    if(dp[y][x] >= 0) return dp[y][x];
    if(y >= m.size()) return dp[y][x] = 1;
    if(m[y][x] == 1) return dp[y][x] = 0;
    int ret = 0;
    if(m[y][x] == 2) y++;
    else{
	if(x>0 && y+1<m.size() && m[y+1][x-1] == 0) ret += saiki(m , x-1,y+1);
	if(x+1<m[0].size() && y+1<m.size() && m[y+1][x+1] == 0) ret += saiki(m,x+1,y+1);
    }
    ret += saiki(m,x,y+1);
    return dp[y][x] = ret;
} 

int main(){
    while(true){
	int x,y;
	cin >> x >> y;
	if(x == 0 && y== 0) break;
	vector< vector<int> > m(y,vector<int>(x,0));
	memset(dp,-1,sizeof(dp));
	REP(i,y)REP(j,x)cin >> m[i][j];
	int ans = 0;
	REP(i,x){
	    ans += saiki(m,i,0);
	}
	cout << ans << endl;
    }
    return 0;
}

C++: #include<stdio.h>
#include<string.h>

int main(){
	int kosu[2][20][20],x,y,c,i,j;
	
	while(~scanf("%d%d",&x,&y)){
		if(x==0&&y==0)break;
		memset(kosu,0,sizeof(kosu));
		for(i=1;i<=y;i++){
			for(j=1;j<=x;j++){
				scanf("%d",&c);
				kosu[1][i][j]=c;
			}
		}
		
		for(i=1;i<=x;i++){
			if(kosu[1][1][i]==0)kosu[0][1][i]=1;
		}
		
		for(i=2;i<y;i++){
			for(j=1;j<=x;j++){
				if(kosu[1][i][j]==1)continue;
				if(kosu[1][i-2][j]==2)kosu[0][i][j]+=kosu[0][i-2][j];
				if(kosu[1][i][j]==2){
					kosu[0][i][j]+=kosu[0][i-1][j];
				}else{
					kosu[0][i][j]+=((kosu[1][i-1][j-1]==2?0:kosu[0][i-1][j-1])+(kosu[1][i-1][j]==2?0:kosu[0][i-1][j])+(kosu[1][i-1][j+1]==2?0:kosu[0][i-1][j+1]));
				}
			}
		}
		
		if(y==1){
			j=0;
			for(i=1;i<=x;i++){
				j+=kosu[0][y][i];
			}
			printf("%d\n",j);
			continue;
		}
		
		for(j=1;j<=x;j++){
			if(kosu[1][y-1][j]==2)kosu[0][y][j]+=kosu[0][y-1][j];
			if(kosu[1][y][j]!=1 && kosu[1][y-2][j]==2)kosu[0][y][j]+=kosu[0][y-2][j];
			if(kosu[1][y][j]==1)continue;
			if(kosu[1][y][j]==2){
				kosu[0][y][j]+=kosu[0][y-1][j];
			}else{
				kosu[0][y][j]+=((kosu[1][y-1][j-1]==2?0:kosu[0][y-1][j-1])+(kosu[1][y-1][j]==2?0:kosu[0][y-1][j])+(kosu[1][y-1][j+1]==2?0:kosu[0][y-1][j+1]));
			}
		}
		
		
		j=0;
		for(i=1;i<=x;i++){
			j+=kosu[0][y][i];
		}
		printf("%d\n",j);
	}
	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+1){
    return 1;
  }
  else if(dp[y][x]!=0){
    return dp[y][x];
  }
  else if(maps[y][x]=='2'&&(y+2>=Y+1||maps[y+2][x]!='1')){
    return bun(y+2,x);
  }
  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]=='2'&&(y+3>=Y+1||maps[y+3][nx]!='1')){
	  anss+=bun(y+3,nx);
	}
	else if(maps[y+1][nx]!='1'){
	  anss+=bun(y+1,nx);
	}
      }
    }
    return dp[y][x]=anss;
  }	  	  
}

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

const int MAX_SIZE = 15;
char field[MAX_SIZE+1][MAX_SIZE+3];
int dp[MAX_SIZE+1][MAX_SIZE+3];
int w, h;

bool judge(int i, int j){
	if(j > 0 && j <= w && field[j][i] == '0' && j <= h)
		return true;
	return false;
}

int main(){
	while(cin >> w >> h){
		if(w == 0 && h == 0) break;
		for(int i = 1; i <= h; i++){
			for(int j = 1; j <= w; j++)
				cin >> field[j][i];
		}
		int pattern = 0;
		for(int i = 0; i < MAX_SIZE+1; i++){
			for(int j = 0; j < MAX_SIZE+3; j++){
				dp[i][j] = 0;
			}
		}
		for(int i = 1; i <= w; i++){
			if(field[i][1] == '0')
				dp[i][1] = 1;
		}
		for(int i = 1; i < h; i++){
			for(int j = 1; j <= w; j++){
				if(field[j][i] == '2'){
					dp[j][i+2] += dp[j][i];
				}else if(field[j][i] == '0'){
					if(field[j][i+1] != '1') dp[j][i+1] += dp[j][i];
					if(judge(i+1, j-1)) dp[j-1][i+1] += dp[j][i];
					if(judge(i+1, j+1)) dp[j+1][i+1] += dp[j][i];
				}else{
					dp[j][i] = 0;
				}
			}
			
		}
		int count = 0;
		for(int i = h; i <= h+1; i++){
			for(int j = 1; j <= w; j++){
				count += dp[j][i];
			}
		}
		cout << count << endl;
	}
	return 0;
}

C++: #include<stdio.h>

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

int main(void)
{
	int **map, f1, f2, f3, **temp, x, y, sum, px, py;
	
	while(scanf("%d %d", &x, &y) && y > 0)
	{
		map = new int *[y];
		temp = new int *[y];
		sum = 0;

		//マップ土地&動的計画作成
		for(f1 = 0; f1 < y; f1++)
		{
			map[f1] = new int [x];
			temp[f1] = new int [x];
		}
		//マップ構成入力&初期化
		for(f1 = 0; f1 < y; f1++)
		{
			for(f2 = 0; f2 < x; f2++)
			{
				scanf("%d",&map[f1][f2]);
				temp[f1][f2] = 0;
			}
		}
		//最上のスタート地点設定
		for(f1 = 0; f1 < x; f1++)
		{
			if(map[0][f1] != 1)
			{
				temp[0][f1] = 1;
				sum++;
			}
		}
		//探索
		if(y >= 2)
		{
			sum = 0;
			for(f1 = 0; f1 < y - 1; f1++)
			{
				for(f2 = 0; f2 < x; f2++)
				{
					if(map[f1][f2] == 0 && temp[f1][f2] > 0)
					{
						for(f3 = 0; f3 < 3; f3++)
						{
							//移動
							px = f2 + dx[f3];
							py = f1 + dy[f3];
							//範囲内か
							if(px >= 0 && px < x)
							{
								//同じｘ座標からのジャンプ台
								if(f3 == 1 && py < y - 1){
									//ｙ軸2つ先へ
									while(py < y - 1 && map[py][px] == 2)
										py += 2;
								}
								//着地した場所がゴール地点のｙ座標と同じで障害物にぶつかってないか
								//ゴール地点のｙ座標を超えたか
								if(py > y - 1 || py == y - 1 && map[py][px] != 1)
									sum += temp[f1][f2];
								//超えてないが、障害物がない地点に着地したか
								else if(map[py][px] == 0)
									temp[py][px] += temp[f1][f2];
							}
						}
					}
				}
			}
		}
		//出力
		printf("%d\n",sum);
	}

	return 0;
}