先看题目: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); }