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>

using namespace std;

int main()
{
	int i,j;
	int map[20][20];
	int smap[20][20]={0};
	int mx,my;
	int next[3]={-1,0,1};
	
	for(;;)
	{
		int ans=0;
		
		cin >> mx >> my ;
		
		if(mx==0 && my==0)
			break;
		
		for(i=0;i<20;i++)
			for(j=0;j<20;j++)
			{
				smap[i][j]=0;
				map[i][j]=0;
			}
		
		for(i=0;i<my;i++)
		{
			for(j=0;j<mx;j++)
			{
				cin >> map[i][j] ;
			}
		}
		for(i=0;i<mx;i++)
		{
			if(map[0][i]!=1)
				smap[0][i]=1;
		}
		for(i=0;i<my-1;i++)
		{
			for(j=0;j<mx;j++)
			{
				if(map[i][j]==2)
				{
					if(map[i+2][j]!=1)
						smap[i+2][j]+=smap[i][j];
				}
				else
				{
					for(int k=0;k<3;k++)
					{
						if(j+next[k]>=0 && j+next[k]<mx)
						{
							if(map[i+1][j+next[k]]==1)
							{
								smap[i+1][j+next[k]]=0;
							}
							else if(map[i+1][j+next[k]]==0)
							{
								smap[i+1][j+next[k]]+=smap[i][j];
							}
							else if(map[i+1][j+next[k]]==2 && j==j+next[k])
							{
								smap[i+1][j+next[k]]+=smap[i][j];
							}
						}
					}
				}
			}
		}
		
		for(i=my-1;i<my+1;i++)
		{
			for(j=0;j<mx;j++)
				ans+=smap[i][j];
		}
		cout << ans << endl;
	}
}

C++: #include<iostream>
using namespace std;
 
int main(){
        int x,y;
        while(cin>>x>>y,x){
                int D[16][16],P[16][16],ans=0;
                for(int i=0;i<256;i++)P[i/16][i%16]=0;
                for(int i=0;i<y;i++)for(int j=0;j<x;j++)cin>>D[i][j];
                for(int i=0;i<x;i++)if(!D[0][i])P[0][i]=1;
                for(int i=0;i<y-1;i++){
                        for(int j=0;j<x;j++){
                                if(!D[i][j]){
                                        P[i+1][j]+=P[i][j];
                                        if(j>0 && !D[i + 1][j - 1])P[i+1][j-1]+=P[i][j];
                                        if(j<x-1 && !D[i + 1][j + 1])P[i+1][j+1]+=P[i][j];
                                }
                                if(D[i][j]==2){
//                                        if(i+2>y-1)P[i+1][j]+=P[i][j];
                                        P[i+2][j]+=P[i][j];
                                }
                        }
                }
                for(int i=0;i<x;i++){
                    if (D[y - 1][i] != 1) ans+=P[y-1][i];
                    if (y >= 2 && D[y - 2][i] == 2) ans += P[y - 2][i];
                }
                cout<<ans<<endl;
        }
}

C++: #include<stdio.h>
#include<cstdio>
#include<string.h>
#include<cstring>
#include<algorithm>
#include<functional>
#include<math.h>
#include<queue>
#include<ctype.h>
#define MAX  1000000000
#define MIN -1000000000
using namespace std;
int i,j;
int x,y;
long long int dp[1000][1000];
int map[1000][1000];
int main(void){
	scanf("%d %d",&x,&y);
	while(x!=0 && y!=0){
		for(i=1;i<=17;i++){
			for(j=1;j<=15;j++){
				dp[i][j]=0;
				map[i][j]=0;
			}
		}
		for(i=1;i<=y;i++){
			for(j=1;j<=x;j++){
				scanf("%d ",&map[i][j]);
			}
		}
		for(i=1;i<=x;i++){
			if(map[1][i]!=1){
				dp[1][i]=1;
			}
		}
		for(i=1;i<y;i++){
			for(j=1;j<=x;j++){
				if(dp[i][j]>0 && map[i][j]!=2){
					if(map[i+1][j-1]==0){
						if(j-1<0);
						else {
							dp[i+1][j-1]+=dp[i][j];
						}
					}
					if(map[i+1][j]!=1 ){
						if(map[i+1][j]==0){
							dp[i+1][j]+=dp[i][j];
						}
						else {
							int temp;
							temp=i+1;
							while(map[temp][j]==2){
								temp+=2;
								dp[temp][j]+=dp[i][j];
							}
						}
					}
					if(map[i+1][j+1]==0){
						if(j+1>x);
						else {
							dp[i+1][j+1]+=dp[i][j];
						}
					}
				}
			}
		}
		/*for(i=1;i<=y+1;i++){
			printf("%d=",i);
			for(j=1;j<=x;j++){
				printf("%d ",dp[i][j]);
			}
			printf("\n");
		}*/
		int cnt=0;
		for(i=0;i<=1;i++){
			for(j=1;j<=x;j++){
				cnt+=dp[y+i][j];
			}
		}
		printf("%d\n",cnt);
		scanf("%d %d",&x,&y);
	}
	return 0;
}

C++: #include <bits/stdc++.h>

using namespace std;

int field[16][15];
int dp[16][15];

int n, m;

bool isIn(int x, int y){
    return 0 <= x && x < n && 0 <= y && y < m;
}

int main(){
    while(cin >> n >> m, n+m){
        for(int i=0; i < n; i++) for(int j=0; j< m; j++)cin >> field[i][j];
        for(int i=0; i < 16; i++) for(int j=0; j < 15; j++) dp[i][j] = 0;
        for(int i=0; i < m; i++) dp[0][i] = 1;
        for(int i=0; i < n; i++){
            for(int j=0; j < m; j++){
                if(field[i][j] == 0){
                    for(int k=-1; k <= 1; k++){
                        if(isIn(i+1, j+k) && !(k != 0 && field[i+1][j+k] == 2)){
                            dp[i+1][j+k] += dp[i][j];
                        }
                    }
                }
                else if(field[i][j] == 1) dp[i][j] = 0;
                else if(field[i][j] == 2){
                    if(isIn(i+1, j))dp[i+2][j] += dp[i][j];
                    else dp[i+1][j] += dp[i][j];
                }
            }
        }
        for(int i=0; i< m; i++) if(field[n-1][i] != 1) dp[n][i] += dp[n-1][i];
        int count = 0;
        for(int i=0; i< m; i++) count += dp[n][i];
        cout << count << endl;
    }
}