先看题目:https://ac.nowcoder.com/acm/problem/53675
题目描述:
给出一个m*n的地图,标0的可以走,标1的不能走。问从(m,1)点开始走到(1,n)点有多少条路径?

解题思路:
与过河卒那题一样的解法,这里就不再多说了。不同之处在于枚举方向跟据题意需要变化。数据量比较多要用快速读入。

代码:

#include<bits/stdc++.h>
using namespace std;
int mp[3010][3010];
int dp[3010][3010];
template<class T>inline void read(T &res)
{
    char c;T flag=1;
    while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;res=c-'0';
    while((c=getchar())>='0'&&c<='9')res=res*10+c-'0';res*=flag;
}

int main()
{
    int m, n;
    scanf("%d%d",&m,&n);
    for(int i = 1; i <= m; i++)
        for(int j = 1; j <= n; j++)
            read(mp[i][j]);
    dp[m][1] = 1;
    for(int i = m; i >= 1; i--) {
        for(int j = 1; j <= n; j++) {
            if(i == m && j == 1) continue;
            if(mp[i][j]) {dp[i][j] = 0;continue;}
            if(i == m) {dp[i][j] = dp[i][j-1]%2333; continue;}
            if(j == 0) {dp[i][j] = dp[i+1][j]%2333; continue;}
            dp[i][j] = (dp[i+1][j]+dp[i][j-1])%2333;
        }
    }

    printf("%d\n",dp[1][n]%2333);
}