思路:用动态规划做。创建F[i][j]数组存取坐标(i,j)的方法总数。F[i][j]=F[i][j-1]+F[i+1][j]。首先对第一列和第一行进行赋初值(注意如果中间有一个1则后面的方法都为0),然后进行计算(当坐标值为1时,将F[i][j]赋值为0.
注意:全程纵坐标都是反的。赋左下角坐标初值F[m][1]=0。

#include "iostream"
#include "algorithm"
using namespace std;
int a[3001][3001];
int F[3001][3001];
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,i,j;
    read(m);read(n);
    for(i=1;i<=m;i++)
        for(j=1;j<=n;j++)
            read(a[i][j]);
    F[m][1]=1;
    for(i=m-1;i>=1;i--){
        if(a[i][1]==1)F[i][1]=0;
        else F[i][1]=F[i+1][1];
    }
    for(i=2;i<=n;i++){
        if(a[m][i]==1)F[m][i]=0;
        else F[m][i]=F[m][i-1];
    }
    for(i=m-1;i>=1;i--)
        for(j=2;j<=n;j++){
            if(a[i][j]==1){
                F[i][j]=0;
            }else{
                F[i][j]=(F[i][j-1]+F[i+1][j])%2333;
            }
        }
    cout<<F[1][n];
}