题意:公园在(1,1)点,火车站在(n,m)点,你需要从公园走到火车站,前进时只能距离车站越来越近不能往回走~路上有些地方有障碍(unsafe)不能走,问总的路线有多少。
简单的dp,不过dp我是写成函数而不是简答的数组,用a[i][j]=0表示可以走,a[i][j]=1表示不能走。递归调用时注意边界,不要越界。
代码:
View Code
1 #include <stdio.h> 2 #include <string> 3 #include <string.h> 4 #include <sstream> 5 #include <iostream> 6 using namespace std; 7 const int MAXN = 200; 8 int a[MAXN][MAXN]; 9 #define DEBUG 10 int n, m; 11 int dp(int i, int j){ 12 if(i==n && j==m) return 1; 13 if(!a[i][j]){ 14 if(i<n && j<m) return dp(i+1, j) + dp(i, j+1); 15 else if(i<n) return dp(i+1, j); 16 else return dp(i, j+1); 17 }else 18 return 0; 19 } 20 int main(){ 21 #ifndef DEBUG 22 freopen("in.txt", "r", stdin); 23 #endif 24 int cas, line=0; 25 scanf("%d", &cas); 26 while(cas--){ 27 memset(a, 0, sizeof(a)); 28 scanf("%d%d", &n, &m); 29 int i, j; 30 string data; 31 getchar(); 32 for(i=1; i<=n; i++){ 33 getline(cin, data); 34 istringstream sin(data); 35 int x; 36 for(j=0; sin>>x; j++) 37 if(j) a[i][x] = 1; 38 } 39 if(line++) printf("\n"); 40 printf("%d\n", dp(1, 1)); 41 } 42 return 0; 43 }
这题目就是输入有点小麻烦,个人不是很想用c的char什么的,用了stringstream解决的。