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 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
| import support.Pair;
import java.util.ArrayDeque; import java.util.Deque;
public class _LCR130衣橱整理 {
public int wardrobeFinishing_bfs(int m, int n, int cnt) { sum = 0; int maxCnt = Math.max(m, n); int[] digitCache = new int[maxCnt + 1]; boolean[][] visited = new boolean[m][n]; Deque<Pair<Integer, Integer>> queue = new ArrayDeque<>(); queue.add(new Pair<>(0, 0)); while (!queue.isEmpty()) { Pair<Integer, Integer> poll = queue.poll(); int i = poll.getKey(); int j = poll.getValue(); if (i < m && j < n && !visited[i][j] && (getDigit(digitCache, i) + getDigit(digitCache, j)) <= cnt) { sum++; visited[i][j] = true; queue.add(new Pair<>(i + 1, j)); queue.add(new Pair<>(i, j + 1)); } } return sum; }
public int wardrobeFinishing_dfs(int m, int n, int cnt) { sum = 0; int maxCnt = Math.max(m, n); int[] digitCache = new int[maxCnt + 1]; boolean[][] visited = new boolean[m][n]; dfs(visited, digitCache, m, n, 0, 0, cnt); return sum; }
int sum = 0;
private void dfs(boolean[][] visited, int[] dp, int m, int n, int i, int j, int cnt) { if (i < m && j < n && !visited[i][j] && (getDigit(dp, i) + getDigit(dp, j)) <= cnt) { sum++; visited[i][j] = true; dfs(visited, dp, m, n, i + 1, j, cnt); dfs(visited, dp, m, n, i, j + 1, cnt); } }
private int getDigit(int[] dp, int i) { if (dp[i] != 0) return dp[i]; int s = 0; int idx = i; for (; i != 0; i /= 10) s += i % 10; dp[idx] = s; return s; }
public static void main(String[] args) { _LCR130衣橱整理 lcr130衣橱整理 = new _LCR130衣橱整理(); System.out.println(lcr130衣橱整理.wardrobeFinishing_dfs(16, 8, 4));
} }
|