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 <algorithm>
#include <string>
#include <cstring>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <cmath>
#include <iomanip>
#include <cassert>
#include <bitset>
using namespace std;

typedef pair<int, int> P;
#define rep(i, n) for (int i=0; i<(n); i++)
#define all(c) (c).begin(), (c).end()
#define uniq(c) c.erase(unique(all(c)), (c).end())
#define _1 first
#define _2 second
#define pb push_back
#define INF 1145141919
#define MOD 1000000007

int W, H;
int C[20][20];
long long dp[20][20];

signed main() {
  ios::sync_with_stdio(false); cin.tie(0);
  while (cin >> W >> H) {
    if (W == 0 && H == 0) break;
    rep(x, 20) rep(y, 20) C[x][y] = dp[x][y] = 0;
    rep(i, H) rep(j, W) cin >> C[j][i];

    rep(x, W) {
      if (C[x][0] == 1) continue;
      dp[x][0] = 1;
    }
    long long s = 0;
    rep(y, H) {
      rep(x, W) {
        for (int d=-1; d<=1; d++) {
          int nx = x+d, ny = y+1;
          if (C[x][y] == 2) {
            if (d != 0) continue;
            ny = y+2;
          }
          if (nx < 0 || nx >= W || C[nx][ny] == 1) continue;
          if (C[nx][ny] == 2 && d != 0) continue;

          if (ny >= H) {
            if (d == 0) s += dp[x][y];
          }
          else dp[nx][ny] += dp[x][y];
        }
      }
    }
    cout << s << "\n";
  }
  return 0;
}

C++: #include<stdio.h>
#include<iostream>
#include<queue>

#define N 15

using namespace std;


int map[N][N];
int paturn[N][N];
queue<int> que;

void printarray(int X,int Y){
  for(int i=0;i<Y;i++){
    for(int j=0;j<X;j++){
      cout << map[i][j];
    }
    cout << endl;
  }
  return;
}


long long int bfs(int X,int Y){
  int cost[N][N];
  long long int cnt=0;
  int dx[3]={-1,0,1};
  int nx;

  for(int i=0;i<Y;i++){//初期化
    for(int j=0;j<X;j++){
      cost[i][j]=0;
    }
  }
  for(int i=0;i<Y;i++){//コスト初期値設定
    for(int j=0;j<X;j++){
      if(map[0][j]==0){
        cost[0][j]=1;
      }
    }
  }


  for(int i=1;i<Y;i++){
    for(int j=0;j<X;j++){

      if(map[i][j]==2){//この列にジャンプ台あれば
        cost[i][j]=cost[i-1][j];
      }

      for(int k=0;k<3;k++){
        nx=j+dx[k];
        if((0<=nx)&&(nx<X)){//範囲外参照防止

          if(map[i][j]==0){//マップのでいう今の位置に障害物なければ
            if(map[i-1][nx]==0){//一つ上の列各列に何もない
              cost[i][j]=cost[i][j]+cost[i-1][nx];
            }
          }
        }
      }

      if(i>=3){//深さ３以上で
        if(map[i-2][j]==2){//２マス上の位置にジャンプ台あれば
          cost[i][j]=cost[i][j]+cost[i-2][j];
        }
      }
      /*
      if(map[i][j]==2){
        if((i>=3)&&(map[i-2][j]==2)){
          cost[i][j]=cost[i][j]+cost[i-2][j];
        }

      }

    */
    }
  }

  printf("\n");
  for(int i=0;i<Y;i++){
    for(int j=0;j<X;j++){
      printf("%d ", cost[i][j]);
    }
    printf("\n");
  }

  for(int i=0;i<X;i++){//一番下の列を加算
    cnt=cnt+cost[Y-1][i];
    if(map[Y-2][i]==2){
      cnt=cnt+cost[Y-2][i];
    }
  }

  return cnt;
}

int main(){

  int x,y;
  long long int ans;

  cin >> x >> y;

  while((x!=0)&&(y!=0)){

    for(int i=0;i<y;i++){//データセット取得.動作正常
      for(int j=0;j<x;j++){
        cin >> map[i][j];//データセット入力
        paturn[i][j]=0;//paturn配列に初期値設定
      }
    }

    ans=bfs(x,y);

    cout << ans << endl;

    for(int i=0;i<y;i++){//mapの初期化.動作正常
      for(int j=0;j<x;j++){
        map[i][j]=0;
      }
    }

    ans=0;

    cin >> x >> y;//次のｘ、ｙの取得
  }

  return 0;
}

C++: #include <cstdio>
#include <cstring>
#define NORMAL 0
#define TREE 1
#define JUMP 2
#define DR_NUM 3 // 方向数

using namespace std;

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

int main(void){
	int x, y, course[15][15], dp[17][15], i, j, k, l, ans;
	while(1){
		scanf("%d%d",&x,&y);
		if(x == 0 && y == 0){
			break;
		}
		for(i = 0;i < y;i++){
			for(j = 0;j < x;j++){
				scanf("%d",&course[i][j]);
			}
		}
		memset(dp,0,sizeof(dp));
		for(i = 0;i < x;i++){
			dp[0][i] = 1;
		}
		for(j = 0;j < y;j++){
			for(k = 0;k < x;k++){
				if(course[j + 2][k] != TREE && (course[j][k] == JUMP || j == y - 1)){
					dp[j + 2][k] += dp[j][k];
				}else if(course[j][k] == NORMAL){
					for(l = 0;l < DR_NUM;l++){
						if(k + dx[l] >= 0 && k + dx[l] < x && course[j + dy[l]][k + dx[l]] != TREE && !(l != 1 && course[j + dy[l]][k + dx[l]] == JUMP)){
							dp[j + dy[l]][k + dx[l]] += dp[j][k];
						}
					}
				}
			}
		}
		ans = 0;
		for(i = 0;i < x;i++){
			ans += dp[y][i] + dp[y + 1][i];
		}
		printf("%d\n",ans);
	}
	return 0;
}

C++: #include <bits/stdc++.h>
using namespace std;

int main()
{
  int X, Y, c[15][15], dp[15][16];

  while(cin >> X >> Y, X) {
    fill_n( *dp, 15 * 16, 0);
    for(int i = 0; i < X; i++) {
      dp[0][i] = 1;
    }


    for(int i = 0; i < Y; i++) {
      for(int j = 0; j < X; j++) {
        cin >> c[i][j];
      }
    }
    int ret = 0;
    for(int i = 0; i < Y; i++) {
      for(int j = 0; j < X; j++) {
        if(c[i][j] == 0) {
          for(int k = -1; k <= 1; k++) {
            if(j + k < 0 || j + k >= X) continue;
            if(i + 1 >= Y) {
              if(k == 0) ret += dp[i][j];
            } else {
              if(c[i + 1][j + k] == 2 && k != 0) continue;
              dp[i + 1][j + k] += dp[i][j];
            }
          }
        } else if(c[i][j] == 1) {
          continue;
        } else {
          if(i + 2 >= Y) ret += dp[i][j];
          else dp[i + 2][j] += dp[i][j];
        }
      }
    }
    cout << ret << endl;
  }
}