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



