随笔- 509  文章- 0  评论- 151  阅读- 22万 

2014-03-20 02:55

题目:从(0, 0)走到(x, y),其中x、y都是非负整数。每次只能向x或y轴的正方向走一格,那么总共有多少种走法。如果有些地方被障碍挡住不能走呢?

解法1:如果没有障碍的话,组合数学,排列组合公式C(x + y, x)。

代码:

复制代码
 1 // 9.2 How many ways are there to go from (0, 0) to (x, y), if you only go left or up, and one unit at a time?
 2 #include <cstdio>
 3 using namespace std;
 4 
 5 int combination(int n, int k)
 6 {
 7     if (n < k) {
 8         return 0;
 9     } else if (n == 0) {
10         return 0;
11     } else if (k > n / 2) {
12         return combination(n, n - k);
13     }
14 
15     int i;
16     int res, div;
17     
18     res = div = 1;
19     for (i = 1; i <= k; ++i) {
20         res *= (n + 1 - i);
21         div *= i;
22         if (res % div == 0) {
23             res /= div;
24             div = 1;
25         }
26     }
27     if (res % div == 0) {
28         res /= div;
29         div = 1;
30     }
31     
32     return res;
33 }
34 
35 int main()
36 {
37     int x, y;
38     
39     while (scanf("%d%d", &x, &y) == 2 && x >= 0 && y >= 0) {
40         printf("%d\n", combination(x + y, x));
41     }
42     
43     return 0;
44 }
复制代码

解法2:如果有障碍的话,用动态规划。

代码:

复制代码
 1 // 9.2 How many ways are there to go from (0, 0) to (x, y), if you only go left or up, and one unit at a time?
 2 // If some of the positions are off limits, what would you do?
 3 #include <cstdio>
 4 #include <vector>
 5 using namespace std;
 6 
 7 int main()
 8 {
 9     int x, y;
10     int i, j;
11     vector<vector<int> > off_limits;
12     vector<vector<int> > res;
13     
14     while (scanf("%d%d", &x, &y) == 2 && x >= 0 && y >= 0) {
15         ++x;
16         ++y;
17         off_limits.resize(x);
18         res.resize(x);
19         for (i = 0; i < x; ++i) {
20             off_limits[i].resize(y);
21             res[i].resize(y);
22         }
23         for (i = 0; i < x; ++i) {
24             for (j = 0; j < y; ++j) {
25                 scanf("%d", &off_limits[i][j]);
26                 off_limits[i][j] = !!off_limits[i][j];
27                 res[i][j] = 0;
28             }
29         }
30         
31         res[0][0] = off_limits[0][0] ? 0 : 1;
32         for (i = 1; i < x; ++i) {
33             res[i][0] = off_limits[i][0] ? 0 : res[i - 1][0];
34         }
35         for (j = 1; j < y; ++j) {
36             res[0][j] = off_limits[0][j] ? 0 : res[0][j - 1];
37         }
38         for (i = 1; i < x; ++i) {
39             for (j = 1; j < y; ++j) {
40                 res[i][j] = off_limits[i][j] ? 0 : res[i - 1][j] + res[i][j - 1];
41             }
42         }
43         
44         for (i = 0; i < x; ++i) {
45             for (j = 0; j < y; ++j) {
46                 printf("%d ", res[i][j]);
47             }
48             printf("\n");
49         }
50         printf("%d\n", res[x - 1][y - 1]);
51         
52         for (i = 0; i < x; ++i) {
53             off_limits[i].clear();
54             res[i].clear();
55         }
56         off_limits.clear();
57         res.clear();
58     }
59     
60     return 0;
61 }
复制代码

 

 posted on   zhuli19901106  阅读(278)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示