首页 新闻 赞助 找找看

这个关于算法的东西,有人知道吗?

1
悬赏园豆:10 [已解决问题] 解决于 2012-11-26 14:00

问题如图:

这2个题是面试官问我的,我没有得到正确的答案……哪位知道怎么做吗?谢谢了!

问题补充:

看不清图片的朋友,右键--〉查看图片  就好。

hexllo的主页 hexllo | 菜鸟二级 | 园豆:318
提问于:2012-11-16 19:31
< >
分享
最佳答案
2

第一问:给每个格子标好坐标(为了简洁就从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)),同样的递归。当然你也可以用深度优先搜索来找出所有路径进行比较。

收获园豆:10
水牛刀刀 | 大侠五级 |园豆:6350 | 2012-11-17 19:15

你和楼上这位说得都很靠谱,我看了你的之后测试了一下,结果不正确,你看看是不是这样?

 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 | 园豆:318 (菜鸟二级) | 2012-11-19 13:13

@hexllo: 你写的不对,少了几个临界条件(我上面没说),就是当m==1时,f(1,n) == f(1,n-1),以及当n==1时 f(m,1) == f(m-1,1)。 这2种是边界的情况。

水牛刀刀 | 园豆:6350 (大侠五级) | 2012-11-19 13:31

@水牛刀刀: 

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 | 园豆:318 (菜鸟二级) | 2012-11-21 13:52

@hexllo: 画出来你也看不清楚,各种重叠,你可以把每个格子有多少种走法输出成一个方阵,然后用肉眼看一下是否满足你上面的公式,这很容易看出来对错啊。

水牛刀刀 | 园豆:6350 (大侠五级) | 2012-11-21 14:49

@水牛刀刀: 呵呵,我不是在原图画,想每画一图就把下边的格子也画,画在上一个图右边。

hexllo | 园豆:318 (菜鸟二级) | 2012-11-26 14:00

@hexllo:

JunerLee | 园豆:200 (初学一级) | 2018-12-08 13:15
其他回答(5)
-1

看不清

学学学习 | 园豆:427 (菜鸟二级) | 2012-11-16 20:05
0

回溯就可以解决

花开花又落 | 园豆:357 (菜鸟二级) | 2012-11-16 20:31
1

第一个问题完全是个数学问题,我大概算了一下,应该共有 m*n-m-n+2 种走法。

第二个问题用程序来实现的话,最笨也最简单的方法就是把所有的路径都走一遍,找出最大的那个。

正统的做法应该是数据结构中的带权有向图最短路径问题,你可以百度搜一下,相关的资料大把。

夏狼哉 | 园豆:833 (小虾三级) | 2012-11-17 10:17
0

牛人啊

jone_e | 园豆:1410 (小虾三级) | 2012-11-19 13:06
0

第一个问题《组合数学》里面有讲到,第二个问题,一个简单的动态规划

open source | 园豆:290 (菜鸟二级) | 2012-11-20 10:17
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册