Skip to content

11349: 【原1349】新跳房子

题目

题目描述

author: Rui Yang 原OJ链接:https://acm.sjtu.edu.cn/OnlineJudge-old/problem/1349

Description

John特别喜欢跳房子的游戏,于是他发明了一种游戏:

这个游戏是基于R*C(2 <= R <= 15, 2 <= C <= 15)的格子中,每个格子被染成红色或者蓝色。牛们从左上角开始移动,目标是右下角的格子,移动的每一步只有当满足以下条件的时候才是合法的:

1)你跳向的格子与你现在所在的格子颜色不同;

2)你跳向的格子的行数必须大于你目前所在格子的行数;

3)你跳向的格子的列数必须大于你目前所在格子的列数;

请帮助计算,从左上角到右下角一共有多少条合法的跳跃序列

Input Format

第一行包括两个整数R和C,接下来的R行每行有C个字符('R'或者'B')。其中,R代表红色,B代表蓝色

Output Format

输出从左上角到右下角所有的可能跳跃方法的数量。

Sample Input:

4 4
RRRR
RRBR
RBBR
RRRR

Sample Output:

3

yyong119's solution

#include <cstdio>
#define MAX_N 20
using namespace std;
int r, c;
int f[MAX_N][MAX_N];
char map[MAX_N][MAX_N];
inline int read_RB() {
    char ch = getchar();
    while (ch != 'R' && ch != 'B') ch = getchar();
    return ch;
}
int main() {
    scanf("%d %d", &r, &c);
    for (register int i = 0; i < r; ++i)
        for (register int j = 0; j < c; ++j)
            map[i][j] = read_RB();
    f[0][0] = 1;
    for (register int bx = 1; bx < r; ++bx)
        for (register int by = 1; by < c; ++by)
            for (register int ax = 0; ax < bx; ++ax)
                for (register int ay = 0; ay < by; ++ay)
                    if (map[ax][ay] != map[bx][by])
                        f[bx][by] += f[ax][ay];
    // for (register int i = 0; i < r; ++i) {
    //     for (register int j = 0; j < c; ++j)
    //         printf("%d ", f[i][j]);
    //     printf("\n");
    // }
    printf("%d", f[r - 1][c - 1]);
    return 0;
}