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++: 5 5
0 0 0 0 1
2 1 0 2 0
1 0 0 1 1
0 2 1 2 0
0 1 0 0 0
5 5
0 0 1 0 0
2 1 0 2 0
1 0 0 1 1
0 2 1 2 0
0 1 0 0 0
15 15
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 08
6
52694573

bash-4.3(luke):~/syoribu/AOJ/PCK
512:{ei1629}$ cat AOJ203.cpp
#include <bits/stdc++.h>
using namespace std;

int main()
{
    int W, H;


    while ( cin >> W >> H, W || H ) {
        int dp[22][22] = {};
        int mas[22][22] = {};

        for ( int i = 0; i < H; i++ ) {
            for ( int j = 0; j < W; j++ ) {
                cin >> mas[i][j];
            }
        }

        for ( int i = 0; i < W; i++ ) {
            if ( mas[0][i] == 0 ) {
                dp[0][i] = 1;
            }
        }

        for ( int i = 0; i < H - 1; i++ ) {
            for ( int j = 0; j < W; j++ ) {
                if ( mas[i][j] == 2 ) {
                    if ( mas[i + 2][j] != 1 ) {
                        dp[i + 2][j] += dp[i][j];
                    }
                } else {
                    for ( int k = -1; k <= 1; k++ ) {
                        if ( 0 <= j + k && j + k < W ) {
                            if ( mas[i + 1][j + k] == 0 ) {
                                dp[i + 1][j + k] += dp[i][j];
                            } else if ( k == 0 && mas[i + 1][j] == 2 ) {
                                dp[i + 1][j] += dp[i][j];
                            }
                        }
                    }
                }
            }
        }
        int sum = 0;
        for ( int i = 0; i < W; i++ ) {
            sum += dp[H - 1][i] + dp[H][i];
        }

        cout << sum << endl;
    }
    return ( 0 );
}

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+2;i++){
			printf("%d=",i);
			for(j=1;j<=x;j++){
				printf("%d ",dp[i][j]);
			}
			printf("\n");
		}*/
		int cnt=0;
		for(i=0;i<=2;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 <iostream>
using namespace std;
int w,h;
int mp[20][20],memo[20][20];
int saiki(int x,int y){
  if(y >= h-1) return 1;
  for(int i=-1;i<=1;i++) {
    int nx = x+i, ny = y+1;
    if(nx==x && mp[ny][nx] == 2)while(mp[ny][nx] == 2) ny+=2;
    if(nx <0|| nx >= w ||mp[ny][nx] != 0) continue;
    if(memo[ny][nx]==0) memo[y][x]+=saiki(nx,ny);
    else memo[y][x] += memo[ny][nx];
  }
  mp[y][x] = 1;
  return memo[y][x];
}
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] = mp[i][j] = 0;
    
    for(int i=0;i<h;i++)
      for(int j=0;j<w;j++)cin >> mp[i][j];
   
    int cnt = 0;  
    for(int i=0;i<w;i++)
      if(mp[0][i] !=1)cnt+=saiki(i,0);
    cout << cnt <<endl;
  }
  return 0;
}

C++: #include<iostream>

using namespace std;

int X, Y;
int status[17][18];	//status[x][y]
int memo[17][18];
int i, j;
int count;

int check(int x, int y);

int main(){

	while(1){

		count = 0;

		cin >> X >> Y;

		if(X == 0 && Y == 0){break;}

		else{

			//フィールドの入力
			//i行目について( 1 <= i <= Y+2 )
			for(i = 1; i <= Y+2; i++){
				//j文字目について( 0 <= j <= X+1)
				for(j = 0; j <= X+1; j++){

					//Y+1, Y+2列目に移動できるようにする。
					if(i > Y){
						status[j][i] = 0;
					}
					//両サイドには障害物を敷き詰める。
					else if(j == 0 || j == X+1){
						status[j][i] = 1;
					}
					else{
						cin >> status[j][i];
					}
				}
			}

/*//フィールド出力
			for(i = 1; i <= Y+2; i++){
				for(j = 0; j <= X+1; j++){
					cout << status[j][i];
				}
				cout << endl;
			}
*/

			for(i = 1; i <= X; i++){
				memset(memo, 0, sizeof(memo));
				count += check(i, 1);
			}

			cout << count << endl;
		}
	}

	return 0;
}


int  check(int x, int y){

//	cout << "x:" << x << "y:" << y << " : "<< status[x][y] << endl;

	//関数のメモが残っているならメモを返す
	if(memo[x][y] > 0){return memo[x][y];}

	//status[x][y]の次でゴール
	if(status[x][y] == 1){return 0;}
	if(status[x][y] == 0 && y == Y){return 1;}
	if(status[x][y] == 2 && (y == Y-1 || y == Y)){return 1;}

	//それ以外
	else{
		//ジャンプ台
		if(status[x][y] == 2){
			memo[x][y] += check(x, y+2);
		}
		//平地
		else{
			if(status[x-1][y+1] == 0){
				memo[x][y] += check(x-1, y+1);
			}
			if(status[x][y+1] == 0 || status[x][y+1] == 2){
				memo[x][y] += check(x, y+1);
			}
			if(status[x+1][y+1] == 0){
				memo[x][y] += check(x+1, y+1);
			}
		}

		return memo[x][y];
	}
}