Problem:
会津山スキー場の新企画
会津山スキー場の経営者である油木屋さんは、上級者向けとして障害物やジャンプ台を配置したコースを用意しました。コースにはいろいろな滑り方があり、シーズン中に全てのパターンの滑り方が出来た利用者には、プレゼントを贈ることになっています。
油木屋さんのために、コースの見取り図をもとに滑り方のパターン数を出力するプログラムを作ってあげましょう。
コースは上図のような
X × Y
個のマスからなるグリッドで表されます。左上を原点とし、x 座標は右に行くにつれて大きくなり、y 座標は下にいくにつれて大きくなるものとします。
各滑り方のパターンは、最も高いところ(
y = 1
、ただし障害物の無いところ) からスタートし、ゴール(
y = Y
) に向かって進んでいきます。グリッドのマス(
x, y
) にいる滑走者は、(
x − 1, y + 1
)、(
x, y + 1
)、 (
x + 1, y + 1
) のいずれかに移動することができます。マスには、障害物やジャンプ台があり、障害物のあるマスには進入できず、ジャンプ台があるマスに進入すると(
x, y + 2
) へ移動します。ただし、いちばん高いマス (
y = 1
のマス) にはジャンプ台は存在せず、ジャンプ台のあるマスに進入する際には x 座標が同じマスからしか進入できません。コースの上端(
y = 1
) からスタートし、コースからはずれることなく下端を超えれば(
y ≥ Y
) 1つの滑り方とみなし、滑り終わります。
コースの情報を入力とし、滑り方の総数を出力するプログラムを作成してください。
Input
複数のデータセットの並びが入力として与えられます。入力の終わりはゼロふたつの行で示されます。各データセットは以下の形式で与えられます。
X
Y
c
11
c
21
...
c
X1
c
12
c
22
...
c
X2
:
c
1Y
c
2Y
...
c
XY
1 行目にコースの大きさ
X, Y
(1 ≤
X, Y
≤ 15) が与えられます。続く
Y
行にコースの情報が与えられます。
c
ij
(0 , 1 , 2 のいずれか) は
x = i, y = j
のマスの情報を表す整数で、0 が移動可能なマス、1 が障害物があるマス、2 がジャンプ台があるマスを表します。
データセットの数は 50 を超えません。
Output
入力データセットごとに、コースの滑り方のパターン数を1行に出力します。
Sample Input
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 0
Output for the Sample Input
8
6
52694573

Submitted solutions:

code_snippet: #include <iostream>
#include <cstring>
#define N 15
using namespace std;
int X, Y, data[N][N], memo[N][N];
int func(int, int);
int jump(int, int);
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  while (1) {
    cin >> X >> Y;
    if (X == 0 && Y == 0)
      break;
    memset(data, 0, sizeof(data));
    memset(memo, 0, sizeof(memo));
    for (int i = 0; i < Y; i++)
      for (int j = 0; j < X; j++)
        cin >> data[i][j];
    int cnt = 0;
    for (int i = 0; i < X; i++)
      if (data[0][i] == 0)
        cnt += func(0, i);
    cout << cnt << "\n";
  }
  return 0;
}
int func(int y, int x) {
  if (y == Y - 1) {
    memo[Y - 1][x] = 1;
    return 1;
  }
  if(memo[y][x])
    return memo[y][x];
  if (0 <= x - 1 && data[y + 1][x - 1] == 0)
    memo[y][x] += func(y + 1, x - 1);
  if (x + 1 < X && data[y + 1][x + 1] == 0)
    memo[y][x] += func(y + 1, x + 1);
  if (data[y + 1][x] == 0)
    memo[y][x] += func(y + 1, x);
  if (data[y + 1][x] == 2) {
    int r = jump(y + 1, x);
    if (r == -2)
      memo[y][x] += 1;
    else if (r != -1)
      memo[y][x] += func(r, x);
  }
  return memo[y][x];
}
int jump(int y, int x) {
  while (1) {
    y += 2;
    if (data[y][x] == 1)
      break;
    if (y >= Y - 1)
      return -2;
    if (data[y][x] == 0)
      return y;
  }
  return -1;
}
accuracy: 1
time_ms: 130
memory_kb: 3180
final_rank: 5

code_snippet: #include <iostream>
#include <cstring>
#define N 15
using namespace std;
int X, Y, data[N][N], memo[N][N];
int func(int, int);
int jump(int, int);
int main() {
    ios_base::sync_with_stdio(false); //to optimize input/output operations
    cin.tie(NULL); //to optimize input/output operations
    while (1) {
        cin >> X >> Y;
        if (X == 0 && Y == 0)
            break;
        memset(data, 0, sizeof(data)); //to initialize 'data' array to 0
        memset(memo, 0, sizeof(memo)); //to initialize 'memo' array to 0
        for (int i = 0; i < Y; i++) {
            for (int j = 0; j < X; j++) {
                cin >> data[i][j];
            }
        }
        int cnt = 0;
        for (int i = 0; i < X; i++) {
            if (data[0][i] == 0) {
                cnt += func(0, i);
            }
        }
        cout << cnt << endl;
    }
    return 0;
}
int func(int y, int x) {
    if (y == Y - 1) {
        memo[Y - 1][x] = 1;
        return 1;
    }
    if (memo[y][x] != 0) {
        return memo[y][x];
    }
    int res = 0;
    if (0 <= x - 1 && data[y + 1][x - 1] == 0) {
        res += func(y + 1, x - 1);
    }
    if (x + 1 < X && data[y + 1][x + 1] == 0) {
        res += func(y + 1, x + 1);
    }
    if (data[y + 1][x] == 0) {
        res += func(y + 1, x);
    }
    if (data[y + 1][x] == 2) {
        int r = jump(y + 1, x);
        if (r == -2) {
            res += 1;
        }
        else if (r != -1) {
            res += func(r, x);
        }
    }
    memo[y][x] = res;
    return res;
}
int jump(int y, int x) {
    while (1) {
        y += 2;
        if (data[y][x] == 1) {
            break;
        }
        if (y >= Y - 1) {
            return -2;
        }
        if (data[y][x] == 0) {
            return y;
        }
    }
    return -1;
}
accuracy: 1
time_ms: 120
memory_kb: 3216
final_rank: 6

code_snippet: #include<bits/stdc++.h>
using namespace std;
using ll=long long;
ll x,y,c[17][17],s,i,j;
void DFS(ll Y,ll X){
    if(c[Y][X]==1){
        return;
    }
    if(X<1 || X>x){
        return;
    }
    if(Y>=y){
        s++;
        return;
    }
    if(c[Y][X]==2){
        DFS(Y+2,X);
    }else{
        if(c[Y+1][X]!=1){
            DFS(Y+1,X);
        }
        if(c[Y+1][X+1]==0){
            DFS(Y+1,X+1);
        }
        if(c[Y+1][X-1]==0){
            DFS(Y+1,X-1);
        }
    }
}
int main(void){
    while(cin>>x>>y,x){
        for(s=0,i=0;i<17;i++){
            for(j=0;j<17;j++){
                c[i][j]=0;
            }
        }
        for(s=0,i=1;i<=y;i++){
            for(j=1;j<=x;j++){
                cin>>c[i][j];
            }
        }
        for(i=1;i<=x;i++){
            if(c[1][i]==0){
                DFS(1,i);
            }
        }
        cout<<s<<endl;
    }
    return 0;
}
accuracy: 1
time_ms: 450
memory_kb: 3308
final_rank: 8

code_snippet: #include <bits/stdc++.h>
using namespace std;
int x,y,a[17][17],s,i,j;
void dfs(int y1,int x1){
  if(a[y1][x1]==1)return;
  if(x1<1||x1>x)return;
  if(y1>=y){s++;return;}
  if(a[y1][x1]==2)dfs(y1+2,x1);
  else {if(a[y1+1][x1]!=1)dfs(y1+1,x1);
  if(a[y1+1][x1+1]==0)dfs(y1+1,x1+1);
  if(a[y1+1][x1-1]==0)dfs(y1+1,x1-1);}
  return;
}
int main(){
  while(cin>>x>>y,x){
    for(s=0,i=0;i<17;i++)for(j=0;j<17;j++)a[i][j]=0;    
    for(s=0,i=1;i<=y;i++)for(j=1;j<=x;j++)cin>>a[i][j];
    for(i=1;i<=x;i++){if(a[1][i]==0)dfs(1,i);}
    cout<<s<<endl;
  }
}
accuracy: 1
time_ms: 700
memory_kb: 3080
final_rank: 9

code_snippet: #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){
    return 1;
  }
  else if(dp[y][x]!=0){
    return dp[y][x];
  }
  else if(maps[y][x]=='2'){
    if(maps[y+2][x]!='1'){
      return dp[y][x]=bun(y+2,x);
    }
    else{
      return 0;
    }
  }
  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]!='1'){
      anss+=bun(y+1,nx);
    }
      }
    }
    return dp[y][x]=anss;
  }       
}
accuracy: 1
time_ms: 250
memory_kb: 1160
final_rank: 2

code_snippet: #include <iostream>
#define N 15
using namespace std;
int data[N][N];
void func(int,int);
int Cnt(int,int);
int X,Y,cnt;
int main(){
  while(1){
    cin >> X >> Y;
    if(X==0&&Y==0) break;
    for(int i=0;i<Y;i++)
      for(int j=0;j<X;j++)
	cin >> data[i][j];
    cnt=0;
    for(int i=0;i<X;i++){
      if(data[0][i]==0) func(0,i);
    }
    cout << cnt << endl;
  }
  return 0;
}
void func(int y,int x){
  if(y>=Y-1){
    cnt++;
    return;
  }
  if(y+1<Y&&x+1<X&&data[y+1][x+1]==0) func(y+1,x+1);
  if(y+1<Y&&x-1>=0&&data[y+1][x-1]==0) func(y+1,x-1);
  if(y+1<Y&&data[y+1][x]==2){
    int r=Cnt(y,x);
    if(r!=-1) func(r,x);
    else return ;
  }
  if(y+1<Y&&data[y+1][x]==0) func(y+1,x);
}
int Cnt(int y,int x){
  y+=3;
  while(1){
    if(y>=Y-1){
      if(y>Y-1) cnt++;
      else if(y==Y-1&&data[y][x]!=1) cnt++;
      break;
    }
    if(data[y][x]==1) break;
    if(data[y][x]==2) y+=2;
    if(data[y][x]==0) return y;
  }
  return -1;
}
accuracy: 1
time_ms: 980
memory_kb: 1160
final_rank: 7

code_snippet: #include<iostream>
using namespace std;
int solve(int x,int y);
int ax,ay;
int mas[20][20];
int memo[20][20];
int main(){
  while(1){
    int ans=0;
    cin>>ax>>ay;
    if(ax==0 && ay==0) break;
    for(int i=1;i<=ay;i++){
      for(int j=1;j<=ax;j++){
	cin>>mas[i][j];
	memo[i][j]=0;
      }
    }
    for(int i=1;i<=ax;i++){
      if(mas[1][i]!=1){
	ans+=solve(i,1);
      }
    }
    cout<<ans<<endl;
  }
}
int solve(int x,int y){
  if(y>=ay){
    return 1;
  }else if(memo[y][x]!=0){
    return memo[y][x];
  }else if(mas[y][x]==2){
    if(mas[y+2][x]!=1){
      return memo[y][x]=solve(x,y+2);
    } 
    else{
      return 0;
    }
  }
  else if(mas[y][x]==1){
    return 0;
  }
  else{
    int anss=0; 
    if(mas[y+1][x]!=1){
      anss+=solve(x,y+1);
    }
    if(x+1<=ax && 0<x+1 && mas[y+1][x+1]==0){
      anss+=solve(x+1,y+1);
    }
    if(0<x-1 && x-1<=ax && mas[y+1][x-1]==0){
      anss+=solve(x-1,y+1);
    }
    return memo[y][x]=anss;
  }
}
accuracy: 1
time_ms: 160
memory_kb: 1164
final_rank: 1

code_snippet: #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){
    return 1;
  }
  else if(dp[y][x]!=0){
    return dp[y][x];
  }
  else if(maps[y][x]=='2'){
    if(maps[y+2][x]!='1'){
      return dp[y][x]=bun(y+2,x);
    }
    else{
      return 0;
    }
  }
  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]!='1'){
	  anss+=bun(y+1,nx);
	}
      }
    }
    return dp[y][x]=anss;
  }	  	  
}
accuracy: 1
time_ms: 260
memory_kb: 1160
final_rank: 3

code_snippet: #include <iostream>
#include <vector>
#include <cstring>

#define rep(i,n) for(int i=0;i<n;i++)

using namespace std;

int a[16][16];
int count = 0;
int n,m;

void dfs(int y,int x)
{
	if(a[y][x] == 0)
	{

		if(y == m-1)
		{
			count++;
			return;
		}
		if(x-1 >= 0 && y+1 < m)
		{
			if(a[y+1][x-1] != 2)
			{
				dfs(y+1,x-1);
			}
		}
		if(y+1 < m)
		{
			dfs(y+1,x);
		}
		if(x+1 < n && y+1 < m)
		{
			if(a[y+1][x+1] != 2)
			{
				dfs(y+1,x+1);
			}
		}
		return;
	}
	else if(a[y][x] == 1)
	{
		return;
	}
	else if(a[y][x] == 2)
	{
		if(y == m-2 || y == m-1)
		{
			count++;
			return;
		}
		else
		{
			dfs(y+2,x);
		}
	}
}

int main()
{
	while(cin >> n >> m)
	{
		if(n == 0 && m == 0)
		{
			break;
		}

		memset(a,0,sizeof(a));
		rep(i,m)
		{
			rep(j,n)
			{
				cin >> a[i][j];
			}
		}
		count = 0;
		rep(i,n) dfs(0,i);

		cout << count << endl;
	}
	return 0;
}
accuracy: 1
time_ms: 920
memory_kb: 1160
final_rank: 4