经典算法题之(六)------ 二维数组迷宫问题

本文探讨了迷宫最短路径问题的各种情况及其解决方法,包括无障碍和有障碍的环境,以及路径代价是否相等的不同场景。从动态规划的基础算法出发,介绍了如何计算最短路径的数量及总代价。

1.0 无障碍,右下走,代价相等

m*n的方格,要求最短路径从左上角到右下角,有多少种走法(有多少条最短路径)?

解法一:

动态规划,因为是最短路径,所以每一步只能往右或者往下走,那么到第n步(不在第一行或者第一列)只有两种方式:从上往下来的,或者左往右来的。

所以可设二维数组:dp[m][n],dp[i][j]即从入口(a[0][0])走到a[i][j]的最短路径数目,容易推知:

状态方程:dp[i][j] = dp[i][j-1] + dp[i-1][j] 

边界条件:dp[0][j] 和 dp[i][0]

代码很容易写出来:

int[][] dp = new int[m][n];   // 自动赋值0
//第一行第一列,边界条件
for(int i = 0; i < n; i++)
    dp[0][i] = 1;
for(int i = 1; i < m; i++)    // dp[0][0]已经赋过值
    dp[i][0] = 1;
for(int i = 1; i < m; i++){
    for(int j = 1; j < n; j++)
        dp[i][j] = dp[i][j-1]+dp[i-1][j];
}
return dp[m-1][n-1]l;
    

 

解法二:

再看这个图:

其实要最快走到出口,必然要往右走n步,往下走m步,总共要走m+n步。同样地,如果一个走法向走了n步,向下走了m步,那么该走法的路径一定是一条最短路径。

即:往右走n步,往下走m步和最短路径是充分必要条件。

再回到问题,对于路途中的当前步,想往下走(m步没有用完的前提下),还是往右走(n步没有用完的前提下)都是任意的。但是,如果确定了哪些步往右走,则往下走的步数也确定了,如下图:

 

红色(往右走)确定了以后,蓝色自然就确定了。即在m+n步中选好了那些步往右(共n步),剩下的都是往下。

这就是数学中的组合问题(not排列),eg:给m+n个球上色(球标号1~m+n):只能上黑色或者白色,有多少种着色法。

所以问题变成从m+n步中挑出n/m步:   

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值