生活随笔
收集整理的這篇文章主要介紹了
程序员面试金典 - 面试题 08.02. 迷路的机器人(DFS/动态规划)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
文章目錄
- 1. 題目
- 2. 解題
- 2.1 DFS
- 2.2 動態(tài)規(guī)劃
1. 題目
設(shè)想有個機器人坐在一個網(wǎng)格的左上角,網(wǎng)格 r 行 c 列。
機器人只能向下或向右移動,但不能走到一些被禁止的網(wǎng)格(有障礙物)。
設(shè)計一種算法,尋找機器人從左上角移動到右下角的路徑。
網(wǎng)格中的障礙物和空位置分別用 1 和 0 來表示。
返回一條可行的路徑,路徑由經(jīng)過的網(wǎng)格的行號和列號組成。左上角為 0 行 0 列。
示例
1:
輸入
:
[[0,0,0],[0,1,0],[0,0,0]
]
輸出
: [[0,0],[0,1],[0,2],[1,2],[2,2]]
解釋
:
輸入中標(biāo)粗的位置即為輸出表示的路徑,即
0行
0列(左上角)
-> 0行
1列
-> 0行
2列
-> 1行
2列
-> 2行
2列(右下角)
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/robot-in-a-grid-lcci
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。
2. 解題
2.1 DFS
一開始 34/36個通過測試
- 修改,把visited過的地方回溯的時候別改回去,因為不通,所以后面也別走了
class Solution {vector
<vector
<int>> path
;vector
<vector
<int>> ans
;int m
, n
;bool found
= false;vector
<vector
<int>> dir
= {{1,0},{0,1}};
public:vector
<vector
<int>> pathWithObstacles(vector
<vector
<int>>& grid
) {if(grid
.empty() || grid
[0].empty())return {};m
= grid
.size(), n
= grid
[0].size();if(grid
[0][0]==1 || grid
[m
-1][n
-1]==1)return {};vector
<vector
<bool>> visited(m
, vector
<bool>(n
,false));dfs(grid
,0,0,visited
);return ans
;}void dfs(vector
<vector
<int>>& grid
, int i
, int j
, vector
<vector
<bool>> & visited
){if(found
)return;if(i
== m
-1 && j
== n
-1){path
.push_back({i
,j
});ans
= path
;found
= true;return;}visited
[i
][j
] = true;path
.push_back({i
,j
});int x
, y
;for(int k
= 0; k
< 2; ++k
){x
= i
+ dir
[k
][0];y
= j
+ dir
[k
][1];if(x
>=0 && x
<m
&& y
>=0 && y
<n
&& grid
[x
][y
]==0 && !visited
[x
][y
])dfs(grid
,x
,y
,visited
);}path
.pop_back();}
};
28 ms 10.4 MB
2.2 動態(tài)規(guī)劃
- dp[i][j] 表示機器人能否到達該處
- 能到達終點,從終點肯定能隨便走一條路回去
class Solution {
public:vector
<vector
<int>> pathWithObstacles(vector
<vector
<int>>& grid
) {if(grid
.empty() || grid
[0].empty())return {};int m
= grid
.size(), n
= grid
[0].size(), i
, j
, k
;if(grid
[0][0]==1 || grid
[m
-1][n
-1]==1)return {};vector
<vector
<bool>> dp(m
,vector
<bool>(n
,false));for(i
= 0; i
< m
; ++i
){ if(grid
[i
][0]==1)break;elsedp
[i
][0] = true;}for(j
= 0; j
< n
; ++j
){ if(grid
[0][j
]==1)break;elsedp
[0][j
] = true;}for(i
= 1; i
< m
; i
++){for(j
= 1; j
< n
; j
++){if(grid
[i
][j
]==0)dp
[i
][j
] = (dp
[i
-1][j
] || dp
[i
][j
-1]);}}if(dp
[m
-1][n
-1]==false)return {};vector
<vector
<int>> ans(m
+n
-1);k
= m
+n
-2, i
= m
-1, j
= n
-1;while(i
!=0 || j
!=0){ans
[k
--] = {i
,j
};if(i
-1>=0 && dp
[i
-1][j
])i
--;else if(j
-1>=0 && dp
[i
][j
-1])j
--;}ans
[0] = {0,0};return ans
;}
};
20 ms 8.9 MB
總結(jié)
以上是生活随笔為你收集整理的程序员面试金典 - 面试题 08.02. 迷路的机器人(DFS/动态规划)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。