滴滴出行2017秋招工程岗笔试题-地下迷宫

时间限制:1秒

空间限制:32768k

题目描述
小青蛙有一天不小心落入了一个地下迷宫,小青蛙希望用自己仅剩的体力值P跳出这个地下迷宫。为了让问题简单,假设这是一个n*m的迷宫。迷宫每个位置为0或者1. 0代表这个位置有障碍物,小青蛙到达不了这个位置;1代表小青蛙可以达到的位置。小青蛙初始在(0,0)位置。地下迷宫的出口在(0,m-1)(保证这两个位置都是1,并且保证一定有起点到终点可达的路径)。小青蛙在迷宫中水平移动一个单位距离需要消耗1点体力值。向上爬一个单位距离需要消耗3个体力值,向下移动不消耗体力值。当小青蛙的体力值等于0时候还没有到达出口,小青蛙将无法逃离迷宫。现在需要你帮助小青蛙计算出能否用今生的体力值跳出迷宫(即达到(0,m-1)的位置 

输入:

输入 n+1行:
第一行为3个整数n,m(3<=m,n<=10),P(1<=P<=100)
接下来的n行:
每行m个0或者1,以空格分隔
输出:
如果能逃离迷宫,则输出一行体力消耗最小的路径,输出格式见样例所示;如果不能逃离迷宫,则输出“Can not escape!”。
测试数据保证答案唯一
 输入例子:
* 4 4 10
* 1 0 0 1
* 1 1 0 1
* 0 1 1 1
* 0 0 1 1

输出例子:

[0,0],[1,0],[1,1],[2,1],[2,2],[2,3],[1,3],[0,3]

这是个典型的Dynamic Programming(动态编程)问题。 现在让我们来分析一下到底应该怎么解答。

首先,出口[0,m-1]和入口[0,0]都已经给定了,也就是说程序入口和出口是固定的。剩下的需要我们找到一条通过路径并好耗费体力最少。也就是说输出的值时最优的。假设最终由[0,0]到[0,m-1]走了k步,那么k步是剩余体力最大的,那么k-1步是不是在到达k前体力剩余最大的呢?答案是肯定的,那么以此类推,我们就可以退出状态转换公式。那么再来看看慢不满足无后效性:从k到k+1步不会对前面已经走过的最优路线产生影响,所以无后效性。那么现在就让我们看一下状态转移方程吧。

===================================华丽的分割线================================================

我们用f[k][i][j]表示剩余体力。这里:k表示第k步,i 行 j 列时候小青蛙的剩余体力。
那么显然:f[0][0][0]=P
     f[0][0][m-1]>=0 出口时候体力要大于等于0.
并且每一个f[k][0][m-1]都是要最大化的。

那到底怎么最大化呢?我们知道第 k 步是从 k-1 步来的,有三种走法:从 k-1 向上,向右以及向下,并且每一种走法都对应着不同的体力消耗值。所以我们有:

f[k][i][j] = max( f[k-1][i][j-1]-1 , f[k-1][i+1][j], f[k-1][i-1[j]-3  )

这里有些同学可能要问了,在有些边界情况下是不能向下,向上或者向右的,没关系,我们先写出总的状态方程,然后在每走一步时候对情况进行判定就可以剪去一些不必要的枝叶。具体程序如下:

  //输入为二阶迷宫矩阵(n*m)和初始体力值 1 public static void FindPathForFrog(int[][] maze, int P) {
 2         Queue<Integer[]> route = new LinkedList<Integer[]>();
 3         if(findPath(maze, P, 0, 0, route, P)<0)
 4             System.out.println("Can not escape!");
 5     }
 6
 7     private static int findPath(int[][] maze, int restEnergy, int n, int m, Queue<Integer[]> route, int oe) {
 8         // when out of range or frog cannot get through from this place, then
 9         // return
10         if (n < 0 || m < 0 || n > maze.length - 1 || m > maze[0].length - 1 || maze[n][m] == 0 || restEnergy < 0)
11             return -oe;
12
13         // Reach exit with negative energy
14         if (n == 0 && m == maze[0].length - 1 && restEnergy < 0) {
15             return -oe;
16         }
17
18         // Reach to exit with non-negative energy
19         if (n == 0 && m == maze[0].length - 1 && restEnergy >= 0) {
20             route.add(new Integer[] { 0, 0 });
21             for (Integer[] element : route) {
22                 if (element.length != 2)
23                     System.err.println("Error ocurred!");
24                 System.out.println("[" + element[0] + "," + element[1] + "]");
25             }
26             return restEnergy;
27         }
28 //        System.out.println("n: " + n + " m: " + m + " rest: " + restEnergy);
29         if (maze[n][m] == 1)
30             route.add(new Integer[] { n, m });
31         int fromUp = findPath(maze, restEnergy - 3, n + 1, m, route, oe);
32         int fromright = findPath(maze, restEnergy - 1, n, m + 1, route, oe);
33         int fromdown = findPath(maze, restEnergy, n - 1, m, route, oe);
34
35         int mam = Math.max(fromUp, Math.max(fromright, fromdown));
36
37         if (mam == fromUp)
38             route.add(new Integer[] { n + 1, m });
39         else if (mam == fromright)
40             route.add(new Integer[] { n, m + 1 });
41         else if (mam == fromdown)
42             route.add(new Integer[] { n - 1, m });
43         return mam;
44     }

当然这里有几个地方没有细讲,比如如何输出路径和边界判定,希望阅读的朋友自己动脑经弄懂吧。

时间: 2024-07-30 13:52:54

滴滴出行2017秋招工程岗笔试题-地下迷宫的相关文章

滴滴出行2017春招运维岗笔试真题汇总

1.当前云计算技术发展迅速,主流云计算平台大多数都以Linux为基础.请问以下哪个技术是Linux内核提供的可以限制.记录.隔离进程组所使用的物理资源(如:cpu,memory,IO等等)的机制正确答案: B A KVMB cgroupC cgroupD namespace 2.某IP地址为160.55.115.24/20,它的子网划分出来的网络ID地址?正确答案: A A 160.55.112.0B 160.55.115.0C 160.55.112.24D 其他答案都不对 3.TCP协议在建立

跪在某度秋招Web前端笔试题下

今晚跑去华工参加百度Web前端的笔试,做完之后交卷,本来感觉是“为之四顾,为之踌躇满志”的.其中一道题目是关于数组的,回来在电脑上面一敲,顿时为自己的智商和知识羞愧了. 多话不说,直接上题目吧.大概是酱紫的: 代码如下,请写出输出的结果. 1 <script> 2 var str = 'john'; 3 var str2 = 'angus'; 4 5 var arr1 = str.split(''); 6 var arr2 = arr1.reverse(); 7 var arr = str2.

2017美团&amp;网易&amp;360部分笔试题

一.美团笔试 问答题: 1.JavaScript把一个参数从页面A传递给页面B,进行某些操作,然后由页面B回传给页面A 2.各种排序算法的时间复杂度:冒泡排序,选择排序,插入排序,快速排序,归并排序,堆排序. 参考:http://blog.chinaunix.net/uid-25906157-id-3318529.html 编程题: 找出两个有序数组的公共元素,例:有序数组[3, 5, 7, 8, 10, 12]和有序数组[15, 10, 8, 7, 4, 3, 1]的公共元素为(8, 10)

Python求解啤酒问题(携程2016笔试题)

问题描述:一位酒商共有5桶葡萄酒和1桶啤酒,6个桶的容量分别为30升.32升.36升.38升.40升和62升,并且只卖整桶酒,不零卖.第一位顾客买走了2整桶葡萄酒,第二位顾客买走的葡萄酒是第一位顾客的2倍.那么,本来有多少升啤酒呢?解析:由于该酒商只卖整桶酒,简单分析几个桶的容量可知,第二位顾客必须买走剩下的3桶葡萄酒才有可能是第一位顾客的2倍.假设第一位顾客买走的葡萄酒共L升,那么第二位顾客买走的是2L升.也就是说,葡萄酒的总数应该能被3整除.所以,解法就呼之欲出了. Python 解法1 1

棒谷科技java岗笔试题与初试题

选择题 1.银行家算法的作用 2.docker镜像结构 3.docker的默认网络模式 4.spring的动态代理效率比较 5.springboot默认的json 6.springboot多profile分隔符 7.mybatis占位符 8.spring异步注解 9.spring表达式语言 10.高级汇编产生过程 11.maven默认的scope 12.maven optional 13.java8的方法引用 14.lambda表达式 15.微程序存放位置 16.CPU不能直接访问的存储器 17

2019vivo秋招提前批笔试题第3题

笔试的时候没做出来,就顺手截图了. 虽然知道要用动态规划做,但我一直就不太懂动态规划.笔试完又花了2小时把它做出来了.也不知道性能怎么样,但还好做出来了. def solution(n, toltal_money, until_price, until_hot): # 二维数组,每一行代表0到total_money每一个数对应的解(解是一个数组,第0列是最高热度值,后面分别是凑成此热度的因子) # 因为不允许重复采购同一个商品,所以需要标识一下凑成此热度值时已经购买的商品,方便后面的解用到时查看

算法是什么我记不住,But i do it my way. 解一道滴滴出行秋招编程题。

只因在今日头条刷到一篇文章,我就这样伤害我自己,手贱. 刷头条看到一篇文章写的滴滴出行2017秋招编程题,后来发现原文在这里http://www.cnblogs.com/SHERO-Vae/p/5882357.html.看了下,挺有意思,于是就想了想,又写了写,最终撸出来了.刚开始一看顿时感觉很熟悉,大学数据结构和算法课肯定讲过相关东西,什么深度搜索,广度搜索,最优路径,最优解...但是现在你让我说个一二三,我还就只记住几个名字,说不定名字都记错.我向来不喜欢死记东西,能查到的真的不想背下来,而

滴滴出行秋招编程题

算法是什么我记不住,But i do it my way. 解一道滴滴出行秋招编程题. 只因在今日头条刷到一篇文章,我就这样伤害我自己,手贱. 刷头条看到一篇文章写的滴滴出行2017秋招编程题,后来发现原文在这里http://www.cnblogs.com/SHERO-Vae/p/5882357.html.看了下,挺有意思,于是就想了想,又写了写,最终撸出来了.刚开始一看顿时感觉很熟悉,大学数据结构和算法课肯定讲过相关东西,什么深度搜索,广度搜索,最优路径,最优解...但是现在你让我说个一二三,

商业研究(20):滴滴出行,进军海外包车?与OTA携程和包车创业公司,共演“三国杀”?看看分析师、投资人和权威人士等10个人的观点碰撞

 小雷友情提示:创业有风险,投资需谨慎.      前一篇文章,在探讨境外游创业公司-皇包车和易途8的时候,提到"滴滴如果进军海外包车,为海外华人提供打车和包车服务,有较大可能对海外包车公司进行较大打击". 这个想法,之前没怎么考虑,而是通过一个朋友的公众号得知的. 变革家分析了3个"出行类" 创业公司,其中皇包车和易途8主营业务是海外中文接送机+中文包车,还有一个是主打国内P2P租车的凹凸租车.    在针对凹凸租车做投资建议的时候,特别强调滴滴有非常大的可能性进