座標[0,0]から座標[m-1、n-1]まで、地面にm行n列の正方形があります。ロボットは座標[0、0]のグリッドから移動を開始します。ロボットは、一度に1グリッドずつ左、右、上、下に移動でき(グリッドの外側には移動できません)、行座標の合計を入力できません。 k格子より大きい列座標。たとえば、kが18の場合、3 + 5 + 3 + 7 = 18であるため、ロボットは正方形[35、37]に入ることができます。しかし、3 + 5 + 3 + 8 = 19であるため、正方形[35、38]に入ることができません。ロボットはいくつのグリッドに到達できますか?
例1:
输入:m = 2, n = 3, k = 1
输出:3
例2:
输入:m = 3, n = 1, k = 0
输出:1
促す:
1 <= n、m <= 100
0 <= k <= 20
問題解決のアイデア:
到達可能なソリューションの構造と接続性に応じて、抽出しやすいロボットは、右下に移動するだけで、到達可能なすべてのソリューションにアクセスできます。
三角形の内側:すべて接続されている、証明しやすい;
2つの三角形の接続された場所:三角形の解が到達可能である場合、それは左側または上の三角形と接続されている(つまり交差している)必要があります。つまり、ロボットは左または上から三角形に入ることができます。
DFSアイデアの深さ優先探索
Java / C ++コードでアクセスされるのは補助マトリックスであり、PythonではSetです。
class Solution {
public:
int movingCount(int m, int n, int k) {
vector<vector<bool>> visited(m, vector<bool>(n, 0));//标记当前单元格,走过表示ture
return dfs(0, 0, 0, 0, visited, m, n, k);
}
private:
int dfs(int i, int j, int si, int sj, vector<vector<bool>> &visited, int m, int n, int k) {
if(i >= m || j >= n || k < si + sj || visited[i][j]) return 0;//终止条件:
// 当 ① 行列索引越界 或 ② 数位和超出目标值 k 或 ③ 当前元素已访问过 时,返回 0 ,代表不计入可达解。
visited[i][j] = true;
//计算当前元素的 下、右 两个方向元素的数位和,(i + 1, j)在(i , j)下方
//i + 1, j, (i + 1) % 10 != 0 ? si + 1 : si - 8, sj,的原因,行列索引 i加1了,而 j不变,因此继续用sj
// i, j + 1, si, (j + 1) % 10 != 0 ? sj + 1 : sj - 8 同理可得
return 1 + dfs(i + 1, j, (i + 1) % 10 != 0 ? si + 1 : si - 8, sj, visited, m, n, k) +
dfs(i, j + 1, si, (j + 1) % 10 != 0 ? sj + 1 : sj - 8, visited, m, n, k);
}
};
複雑さの分析:
行列の行数と列数をそれぞれMとNとします。
時間計算量O(MN):最悪の場合、ロボットはマトリックスのすべてのセルをトラバースします。このとき、時間計算量はO(MN)です。
スペースの複雑さO(MN):最悪の場合、マトリックスのすべてのセルのインデックスは、O(MN)の余分なスペースを使用して、訪問したセットに格納されます。
著者:jyd
リンク:https://leetcode-cn.com/problems/ji-qi-ren-de-yun-dong-fan-wei-lcof/solution/mian-shi-ti-13-ji-qi-ren -de-yun-dong-fan-wei-dfs-b /
出典:LeetCode(LeetCode)
著作権は作者に帰属します。商用の転載の場合は、著者に連絡して許可を求め、非商用の転載の場合は、出典を示してください。