LeetCode(剑指 Offer)- 13. 机器人的运动范围
Posted 放羊的牧码
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode(剑指 Offer)- 13. 机器人的运动范围相关的知识,希望对你有一定的参考价值。
题目链接:点击打开链接
题目大意:略
解题思路
相关企业
AC 代码
- Java
// 解决方案(1)
class Solution
private int row, col, count, limit;
private boolean[][] path, no;
private int[] calc;
public int movingCount(int m, int n, int k)
limit = k;
count = 0;
row = m;
col = n;
path = new boolean[m][n];
no = new boolean[m][n];
calc = new int[m * n];
dfs(0, 0);
return count;
private void dfs(int i, int j)
if (i < 0 || i >= row || j < 0 || j >= col || path[i][j])
return;
path[i][j] = true;
if (cal(i) + cal(j) <= limit)
count++;
else
no[i][j] = true;
// 此时站在限制位置, 必须马上回退, 这个最容易忘记
return;
// 接下来 4 个 if 为的是不进限制位置
if (i+1 < row && !no[i+1][j])
dfs(i + 1, j);
if (i-1 >= 0 && !no[i-1][j])
dfs(i - 1, j);
if (j+1 < col && !no[i][j+1])
dfs(i, j + 1);
if (j-1 >= 0 && !no[i][j-1])
dfs(i, j - 1);
private int cal(int num)
int tnum = num;
if (calc[tnum] != 0)
return calc[tnum];
int sum = 0;
while (num != 0)
sum += num % 10;
num /= 10;
calc[tnum] = sum;
return sum;
// 解决方案(2)
class Solution
int m, n, k;
boolean[][] visited;
public int movingCount(int m, int n, int k)
this.m = m; this.n = n; this.k = k;
this.visited = new boolean[m][n];
return dfs(0, 0, 0, 0);
public int dfs(int i, int j, int si, int sj)
if(i >= m || j >= n || k < si + sj || visited[i][j]) return 0;
visited[i][j] = true;
return 1 + dfs(i + 1, j, (i + 1) % 10 != 0 ? si + 1 : si - 8, sj) + dfs(i, j + 1, si, (j + 1) % 10 != 0 ? sj + 1 : sj - 8);
// 解决方案(3)
class Solution
public int movingCount(int m, int n, int k)
boolean[][] visited = new boolean[m][n];
int res = 0;
Queue<int[]> queue= new LinkedList<int[]>();
queue.add(new int[] 0, 0, 0, 0 );
while(queue.size() > 0)
int[] x = queue.poll();
int i = x[0], j = x[1], si = x[2], sj = x[3];
if(i >= m || j >= n || k < si + sj || visited[i][j]) continue;
visited[i][j] = true;
res ++;
queue.add(new int[] i + 1, j, (i + 1) % 10 != 0 ? si + 1 : si - 8, sj );
queue.add(new int[] i, j + 1, si, (j + 1) % 10 != 0 ? sj + 1 : sj - 8 );
return res;
- C++
// 解决方案(1)
class Solution
public:
int movingCount(int m, int n, int k)
vector<vector<bool>> visited(m, vector<bool>(n, 0));
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;
visited[i][j] = true;
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);
;
// 解决方案(2)
class Solution
public:
int movingCount(int m, int n, int k)
vector<vector<bool>> visited(m, vector<bool>(n, 0));
int res = 0;
queue<vector<int>> que;
que.push( 0, 0, 0, 0 );
while(que.size() > 0)
vector<int> x = que.front();
que.pop();
int i = x[0], j = x[1], si = x[2], sj = x[3];
if(i >= m || j >= n || k < si + sj || visited[i][j]) continue;
visited[i][j] = true;
res++;
que.push( i + 1, j, (i + 1) % 10 != 0 ? si + 1 : si - 8, sj );
que.push( i, j + 1, si, (j + 1) % 10 != 0 ? sj + 1 : sj - 8 );
return res;
;
以上是关于LeetCode(剑指 Offer)- 13. 机器人的运动范围的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode13. 罗马数字转整数 / 剑指 Offer 42. 连续子数组的最大和 / 剑指 Offer 43. 1~n 整数中 1 出现的次数
[LeetCode]剑指 Offer 35. 复杂链表的复制