图片说明

可以从选择一个空格进行分析最终得到答案,如果一个空格只与其左边的空格相连通(即a[i][j - 1] == 'R'),那么到达这个空格与到达其左边空格的总方案相等。如果一个空格只与其上边的空格相连通(即a[i - 1][j] == 'D'),那么到达这个空格与到达其上边空格的总方案相等。如果一个空格只与其左边的空格相连通(即a[i][j - 1] == 'B',a[i - 1][j] == 'B'),那么到达这个空格的总方案等于左边和上边的总和。

#include<bits/stdc++.h> 

using namespace std;

const int mood = 1e9 + 7;

long long sum[55][55];//记录每个到达该空格的所有方案。
char a[55][55];
int n, m;

int main(){
    cin >> n >> m;
    for (int i = 1; i <= n; i ++)
        for (int j = 1; j <= m; j ++) cin >> a[i][j];

    sum[1][1] = 1;
    for (int i = 1; i <= n; i ++) 
        for (int j = 1; j <= m; j ++){
            if (a[i][j - 1] == 'R' || a[i][j - 1] == 'B') sum[i][j] += sum[i][j - 1] % mood;//加上从左边到达该空格的所有方案。
            if (a[i - 1][j] == 'D' || a[i - 1][j] == 'B') sum[i][j] += sum[i - 1][j] % mood;//加上从上边到达该空格的所有方案。
        }

        cout << sum[n][m] % mood;
    return 0;
}