第一问:给每个格子标好坐标(为了简洁就从1开始了,实际你编程时从0开始)
(1,1) (1,2) ... (1,n-1) (1,n)
(2,1) (2,2) ... (2,n-1) (2,n)
... ... ... ... ...
(m-1,1)(m-1,2) ... (m-1,n-1)(m-1,n)
(m,1) (m,2) ... (m,n-1) (m,n)
用 f(i,j) 表示到(i,j)这个格子有多少走法,那么有:
f(m,n) = f(m-1,n) + f(m,n-1)
递归公式有了,再加上临界条件:f(1,1) = 1, 很容易写出递归函数
第二问:还是上面的坐标,用g(i,j)表示走到 (i,j) 格的最大值,那么 g(i,j) = max(g(i-1,j), g(i,j-1)),同样的递归。当然你也可以用深度优先搜索来找出所有路径进行比较。
你和楼上这位说得都很靠谱,我看了你的之后测试了一下,结果不正确,你看看是不是这样?
static int Move(int m, int n) { if (m == 1 && n == 1) { return 1; } else { return Move(m - 1, n) + Move(m, n - 1); } }
@hexllo: 你写的不对,少了几个临界条件(我上面没说),就是当m==1时,f(1,n) == f(1,n-1),以及当n==1时 f(m,1) == f(m-1,1)。 这2种是边界的情况。
@水牛刀刀:
static int Move(int m, int n) { if (m > 0 && n > 0) { if (m == 1 && n == 1) { return 0; } else if (m == 1 || n == 1) { return 1; } //else if (n == 2 && m > 1) //{ // return m; //} else { return Move(m - 1, n) + Move(m, n - 1); } } else { return 0; } }
好像对了,不过没法验证……如果用GDI把每一种走法画出来,该怎么画呢?
@hexllo: 画出来你也看不清楚,各种重叠,你可以把每个格子有多少种走法输出成一个方阵,然后用肉眼看一下是否满足你上面的公式,这很容易看出来对错啊。
@水牛刀刀: 呵呵,我不是在原图画,想每画一图就把下边的格子也画,画在上一个图右边。
@hexllo:
看不清
回溯就可以解决
第一个问题完全是个数学问题,我大概算了一下,应该共有 m*n-m-n+2 种走法。
第二个问题用程序来实现的话,最笨也最简单的方法就是把所有的路径都走一遍,找出最大的那个。
正统的做法应该是数据结构中的带权有向图最短路径问题,你可以百度搜一下,相关的资料大把。
牛人啊
第一个问题《组合数学》里面有讲到,第二个问题,一个简单的动态规划