某一个位置上的途径数其实源于左边和下面,也就是说某一个位置只来自左边和下边。那么动态方程就可以出来了。
又有可以使用BFS来走这个地图所以在BFS的过程中加入动态规划记录累计的途径数就可以了。
#include <bits/stdc++.h>


using namespace std;

int read() {
    int ans=0, k = 1;
    char ch = getchar();
    while (ch=='-') {
        k = -k;
        ch = getchar();
    }
    while (ch>='0'&&ch<='9') {
        ans = ans*10 + (ch-'0');
        ch = getchar();
    }
    return ans*k;
}
const int maxn = 3000+10;
int n, m;
int a[maxn][maxn];
int dp[maxn][maxn];
int vis[maxn][maxn];
int mod = 2333;
int mv[2][2] = {
    {-1,0},
    {0,1}
};

void BFS() {
    queue<pair<int, int> > q;
    q.push({n, 1});
    dp[n][1] = 1;
    while (!q.empty()) {
        pair<int, int> p = q.front();q.pop();
        for (int i=0;i<2;i++) {
            int next_x = p.first+mv[i][0];
            int next_y = p.second+mv[i][1];
            if (next_x<=0||next_x>n||next_y<=0||next_y>m||a[next_x][next_y]==1) continue;
            dp[next_x][next_y] = dp[next_x][next_y]%mod + dp[p.first][p.second]%mod;
            if (vis[next_x][next_y]) {
                continue;
            }
            q.push({next_x, next_y});
            vis[next_x][next_y] = 1;
        }
    }
}

int main() {
    n = read();m = read();
    for (int i=1;i<=n;i++) {
        for (int j=1;j<=m;j++) {
            a[i][j] = read();
        }
    }
    BFS();
    cout<<dp[1][m]%mod;
    
    return 0;
}