0%

LCR130

问题描述

家居整理师将待整理衣橱划分为 m x n 的二维矩阵 grid,其中 grid[i][j] 代表一个需要整理的格子。整理师自 grid[0][0] 开始 逐行逐列 地整理每个格子。

整理规则为:在整理过程中,可以选择 向右移动一格向下移动一格,但不能移动到衣柜之外。同时,不需要整理 digit(i) + digit(j) > cnt 的格子,其中 digit(x) 表示数字 x 的各数位之和。

请返回整理师 总共需要整理多少个格子

原问题有些描述不清,这里其实是问,可以整理的格子连成一片一片的,最大的那一片有多少格?

题解

DFS、BFS遍历即可解,最大的那一块一定包含(0,0),所以从(0,0)开始向右向下DFS。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
class Solution {

boolean[][] visited;

int m,n,cnt;

public int wardrobeFinishing(int m, int n, int cnt) {

​ this.m=m;this.n=n;this.cnt=cnt;

​ this.visited = new boolean[m][n];

​ return DFS(0,0);

}

public int digit(int i){

​ int res = 0;

​ while(i>0){

​ res+=i%10;

​ i/=10;

​ }

​ return res;

}



public int DFS(int i,int j){

​ if(i>=m||j>=n||visited[i][j]||digit(i)+digit(j)>cnt) return 0;

​ visited[i][j]=true;

​ return DFS(i+1,j)+DFS(i,j+1)+1;

}

}