题目
帕秋莉处于地图的左下角,出口在地图右上角,她只能够向上或者向右行走。
现在给出森林的地图,保证可以到达出口,请问有多少种不同的方案。答案对2333取模。
0  -  空地
1  -  树(无法通过)
保证出发点和终点都是空地。
解题思路
使用动态规划思想。
地图左下角的坐标为 (m-1,0),右上角的坐标为 (0,n-1)。dp[i][j] 表示从左下角到达坐标 (i,j) 的方案数目,dp[m-1][0] = 1。状态转移方程为
如果坐标 (i,j) 是树,dp[i][j] = 0;
如果坐标 (i,j) 是空地,dp[i][j] = dp[i+1][j] + dp[i][j-1]。
最终 dp[0][n-1] 即为所求。
C++代码
#include<cstdio>
#include<vector>
using namespace std;
const int mod = 2333;
int main(){
    int m, n;
    scanf("%d%d", &m, &n);
    vector<vector<char>> ground(m, vector<char>(n));
    char c = getchar();
    int i = 0;
    int j = 0;
    while(1){
        if(c=='0' || c=='1'){
            ground[i][j] = c;
            ++j;
            if(j==n){
                ++i;
                j = 0;
            }
        }
        if(i==m)
            break;
        c = getchar();
    }
    vector<vector<int>> dp(m, vector<int>(n,0));
    dp[m-1][0] = 1;
    for(int i=m-1; i>=0; --i){
        for(int j=0; j<n; ++j){
            if(ground[i][j]=='0'){
                if(i<m-1)
                    dp[i][j] = dp[i+1][j];
                if(j>0)
                    dp[i][j] += dp[i][j-1];
            }
            dp[i][j] %= mod;
        }
    }
    printf("%d\n", dp[0][n-1]);
    return 0;
}
京公网安备 11010502036488号