思路:用动态规划做。创建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]; }