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 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
| import java.util.*;
public class _2850将石头分散到网格图的最少移动次数 {
public int minimumMoves_brute(int[][] grid) { this.grid = grid; for (int i = 0; i < grid.length; i++) { for (int j = 0; j < grid[0].length; j++) { int idx = i * 3 + j; if (grid[i][j] > 1) { while (grid[i][j] > 1) { grid[i][j]--; provider.add(idx); } } if (grid[i][j] < 1) { receiver.add(idx); } } } int min = Integer.MAX_VALUE; List<List<Integer>> lists = permuteUnique_gov(provider); for (List<Integer> list : lists) { int step = 0; for (int i = 0; i < list.size(); i++) { step += Math.abs( list.get(i) / 3 - receiver.get(i) / 3 ); step += Math.abs( list.get(i) % 3 - receiver.get(i) % 3 ); } min = Math.min(min, step); } return min; }
private List<List<Integer>> permuteUnique_gov(List<Integer> nums) { List<List<Integer>> res = new ArrayList<>(); Collections.sort(nums); backtrack(nums.size(), 0, nums, res); return res; }
private void backtrack(int len, int index, List<Integer> output, List<List<Integer>> res) { if (index == len) res.add(new ArrayList<>(output)); Set<Integer> set = new HashSet<>(); for (int i = index; i < len; i++) { if (set.contains(output.get(i))) { continue; } set.add(output.get(i)); Collections.swap(output, index, i); backtrack(len, index + 1, output, res); Collections.swap(output, index, i); } }
List<Integer> provider = new ArrayList<>(); List<Integer> receiver = new ArrayList<>(); int ret; int[][] grid;
public int minimumMoves(int[][] grid) { this.grid = grid; for (int i = 0; i < grid.length; i++) { for (int j = 0; j < grid[0].length; j++) { int idx = i * 3 + j; if (grid[i][j] > 1) { provider.add(idx); } if (grid[i][j] < 1) { receiver.add(idx); } } } ret = Integer.MAX_VALUE; dfs(0, 0); return ret; }
public void dfs(int receiverIdx, int steps) { if (receiverIdx == receiver.size()) { ret = Math.min(ret, steps); return; } int receiverX = receiver.get(receiverIdx) / 3; int receiverY = receiver.get(receiverIdx) % 3; for (int providerIdx : provider) { int providerX = providerIdx / 3; int providerY = providerIdx % 3;
if (grid[providerX][providerY] > 1) { grid[providerX][providerY]--; dfs(receiverIdx + 1, steps + Math.abs(receiverX - providerX) + Math.abs(receiverY - providerY)); grid[providerX][providerY]++; } } }
public static void main(String[] args) { _2850将石头分散到网格图的最少移动次数 solution = new _2850将石头分散到网格图的最少移动次数(); System.out.println(solution.minimumMoves_brute(new int[][]{ {1, 1, 0}, {1, 1, 1}, {1, 2, 1}})); } }
|