跪求大神教一题动态规划

不记得是滴滴还是哪里的一道笔试题。
m*n的个格子,1代表可以走,0不可以走,
一个机器人从(0,0)走到(0,n-1),机器人本身的能量为p
现在机器人向下走不消耗能量,向上走消耗3个能量,向右走消耗1个能量
问能量p能够支撑机器人到达终点?
跪求大神用java写一个答案~
谢谢了,在线等。
全部评论
//C++语法跟Java蛮像得,凑合着参考下? #include<iostream> #include<vector> #include<queue> using namespace std; class Axis { public: int row, col; Axis(){} Axis(int r, int c): row(r), col(c){} Axis(const Axis & a): row(a.row), col(a.col){} bool operator==(const Axis & a) const { return (row == a.row) && (col == a.col); } void print() const{ cout << '[' << row << ',' << col << ']'; } Axis left() const { return Axis(row, col - 1); } Axis right()const { return Axis(row, col + 1); } Axis up() const { return Axis(row - 1, col); } Axis down()const { return Axis(row + 1, col); } }; void findPath(vector<vector<int>> &Map, vector<vector<Axis>> &allpaths, vector<Axis> & path, Axis start, Axis end, int p) { path.push_back(start); if (start == end) { allpaths.push_back(path); return; } if (p <= 0) return; Axis left = start.left(); Axis right = start.right(); Axis up = start.up(); Axis down = start.down(); Map[start.row][start.col] = 0; if (left.col >= 0 && (Map[left.row][left.col] == 1)) { findPath(Map, allpaths, path, left, end, p - 1); } if (right.col < Map[0].size() && (Map[right.row][right.col] == 1)) { findPath(Map, allpaths, path, right, end, p - 1); } if (up.row >= 0 && (Map[up.row][up.col] == 1)) { findPath(Map, allpaths, path, up, end, p - 3); } if (down.row < Map.size() && (Map[down.row][down.col] == 1)) { findPath(Map, allpaths, path, down, end, p); } Map[start.row][start.col] = 1; } bool findPath(vector<vector<int>> &Map, vector<Axis> &path, int p) { if (Map.empty()) return false; if (Map[0].empty()) return false; int m = Map[0].size(); vector<vector<Axis>> allpaths; vector<Axis> apath; findPath(Map, allpaths, apath, Axis(0, 0), Axis(0, m - 1), p); if (allpaths.empty())return false; int minSize = 100000, minIndex; for (int i = 0; i < allpaths.size(); ++i) { if (allpaths[i].size() < minSize) { minSize = allpaths[i].size(); minIndex = i; } } path = allpaths[minIndex]; return true; } int main() { int n, m, p; cin >> n >> m >> p; vector<vector<int>> Map(n, vector<int>(m)); for (int i = 0; i < n; ++i) for (int j = 0; j < m; ++j) cin >> Map[i][j]; vector<Axis> path; bool success = findPath(Map, path, p); if (!success) {cout << "Can not escape!" << endl; return 0;} for (int i = 0; i < path.size(); i++) { path[i].print(); if (i != path.size() - 1) cout << ','; } return 0; }
点赞 回复 分享
发布于 2016-09-25 22:26
你要java我就给不了你,就搜索搞搞,不是dp
点赞 回复 分享
发布于 2016-09-25 22:10
这不是滴滴笔试的题么?用dfs暴力就能过..
点赞 回复 分享
发布于 2016-09-25 22:00
我发过帖子
点赞 回复 分享
发布于 2016-09-25 21:47

相关推荐

07-07 17:06
已编辑
深圳技术大学 golang
点赞 评论 收藏
分享
机械打工仔:不管啥专业,找工作改简历的第一课先把你那排版改了,简历上不要写个人简历四个字,找你要简历的谁不知道这个是简历?而且还占那么多空间,直接把自己名字和基础信息写上面,整体字体大一些。 还有这种经典两页简历一页大空白,导出PDF的时候多了一页几乎全是白的你自己看着不难受吗随手的事为啥不能改掉呢,这是态度问题,你试想一下你是HR你打开简历看到格式都没调整过会是什么感受?你自己都不重视你的简历,HR更不会在意。 然后内容你那个做两年咖啡就别往里写了,简历在精不在多,你在往你的简历里打字的时候就要想好这东西对你要找的工作有没有帮助。自我评价写一行就行了,不如给专业技能单开一栏。核心课程均分90这个真别写了,把你上过的有用的专业课列出来也行。有很多地方废话很多的精炼一下,比如你校内项目第一个写的那些,全然没有重点。 好好修改一下,我看你内容也挺优秀的,别被一个随便做的简历耽误了,我一个同专业的打工人看了都揪心更别说一天看几百份简历的HR
听劝,我这个简历该怎么改...
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-24 13:32
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务