栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

LeetCode LCP45 自行车炫技赛场

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

LeetCode LCP45 自行车炫技赛场


从起点开始,对能达到的位置进行dfs。当速度为0或负值时,递归应停止。
同一个位置可能会经过多次,使用三维数组/vector存储到过的速度。(当速度值过大时也可以用map记录)
若到某点速度为v那么visit[x][y][v] = 1 否则visit[x][y][v] = 0
如果到达某地时发现visit[x][y][v]已经为1,说明之前已经到达过此地。此时应停止递归避免死循环。
仅在第一次到达某地,且速度为1时将位置插入输出vector中,避免重复。
最后对输出结果进行排序。(sort函数中自定义比较函数不是反的)

附上代码:

typedef pair P;
class Solution {
    vector

D{P(0,-1), P(0,1), P(1, 0), P(-1, 0)}; vector> out; public: static bool comp(vector& v1, vector& v2){ if(v1[0] == v2[0]) return v1[1] < v2[1]; return v1[0] < v2[0]; } void dfs(vector>& terrain, vector>& obstacle, vector>>& visit, int x, int y, int v, bool ifstart) { // 检查边界 if(x<0 || y<0 || x>=terrain.size() || y>=terrain[0].size() || v <= 0) return; // 记录到达的速度,若重复则停止 if(!ifstart && visit[x][y][v] == 1) return; // 如果此时速度为1,且第一次到访,将位置加入输出 if(v == 1 && visit[x][y][1] != 1) out.push_back(vector{x, y}); // 将当前位置速度更新(开始除外) visit[x][y][v] = 1; // 所用不同的方向 dfs for(auto d : D) { if(x+d.first<0 || y+d.second<0 || x+d.first>=terrain.size() || y+d.second>=terrain[0].size()) continue; // 保证访问h、o不越界 dfs(terrain, obstacle, visit, x+d.first, y+d.second, v+(terrain[x][y]-terrain[x+d.first][y+d.second]-obstacle[x+d.first][y+d.second]), false); } } vector> bicycleYard(vector& position, vector>& terrain, vector>& obstacle) { vector>> visited(terrain.size(), vector>(terrain[0].size(), vector(120, 0))); visited[position[0]][position[1]][1] = 1; dfs(terrain, obstacle, visited, position[0], position[1], 1, true); sort(out.begin(), out.end(), comp); return out; } };

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/312324.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号