目录
力扣LCR 130. 衣橱整理(原剑指Offer13机器人的运动范围)
解析代码
力扣LCR 130. 衣橱整理(原剑指Offer13机器人的运动范围)
LCR 130. 衣橱整理
难度 中等
家居整理师将待整理衣橱划分为 m x n
的二维矩阵 grid
,其中 grid[i][j]
代表一个需要整理的格子。整理师自 grid[0][0]
开始 逐行逐列 地整理每个格子。
整理规则为:在整理过程中,可以选择 向右移动一格 或 向下移动一格,但不能移动到衣柜之外。同时,不需要整理 digit(i) + digit(j) > cnt
的格子,其中 digit(x)
表示数字 x
的各数位之和。
请返回整理师 总共需要整理多少个格子。
示例 1:
输入:m = 4, n = 7, cnt = 5 输出:18
提示:
1 <= n, m <= 100
0 <= cnt <= 20
class Solution {
public:
int wardrobeFinishing(int m, int n, int cnt) {
}
};
解析代码
一道非常典型的搜索类问题。 可以通过深搜或者宽搜,从 [0, 0] 点出发,按照题目的规则一直往 [m - 1, n - 1] 位置走。 同时设置一个全局变量。每次走到一个合法位置,就将全局变量加一。当我们把所有能走到的路都走完之后,全局变量里面存的就是最终答案。下面是深搜的代码:
class Solution {
int ret, _m, _n, _cnt;
bool vis[101][101];
int dx[4] = {0, 0, -1, 1};
int dy[4] = {1, -1, 0, 0};
public:
int wardrobeFinishing(int m, int n, int cnt) {
_m = m, _n = n, _cnt = cnt;
dfs(0, 0);
return ret;
}
void dfs(int sr, int sc)
{
++ret;
vis[sr][sc] = true;
for(int i = 0; i < 4; ++i)
{
int x = sr + dx[i], y = sc + dy[i];
if(x >= 0 && x < _m && y >= 0 && y < _n && !vis[x][y] && chick(x, y))
dfs(x, y);
}
}
bool chick(int x, int y)
{
int sum = 0;
while(x)
{
sum += (x % 10);
x /= 10;
}
while(y)
{
sum += (y % 10);
y /= 10;
}
return sum <= _cnt;
}
};