public static Box findBest(ArrayList<Box> openable, ArrayList<Box> boxes) { int maxRate = 0; Box bestBox = openable.get(0); for (Box op : openable) { int rate = 0; for (int key : op.getStoredKeys()) { ArrayList<Box> list = findOpenable(boxes, key); if (!list.isEmpty()) { rate += list.get(0).getStoredQty(); } } if (maxRate < rate) { maxRate = rate; bestBox = op; } } return bestBox; }
public static String findOrder(ArrayList<Integer> keys, ArrayList<Box> boxes) { String answer = ""; while (true) { int k = (keys.isEmpty()) ? 0 : keys.get(0); ArrayList<Box> openable = findOpenable(boxes, k); ArrayList<Integer> uselessKeys = new ArrayList<>(); // debug block if (debug) { System.out.println("key " + k + " openable boxes:"); for (Box bx : openable) { System.out.println(bx); } } // ------------ if (openable.size() == 0) { if (keys.size() == 0) { answer = "There is no resolution!"; System.out.println("Boxes which left locked: "); for (Box bx : boxes) { System.out.println(bx); } break; } else { uselessKeys.add(k); keys.removeAll(uselessKeys); k = 0; } } else if (openable.size() != 0) { for (Box bx : openable) { if (bx.getStoredKeys().contains(k)) { if (bx.openAndGet(keys)) { boxes.remove(bx); k = 0; answer += "->" + bx.getNumber(); // debug block if (debug) { System.out.println("Box opened: " + bx.getNumber()); System.out.println(keys); } // ------------ break; } } } if (k != 0) { Box bx = findBest(openable, boxes); if (bx.openAndGet(keys)) { boxes.remove(bx); k = 0; answer += "->" + bx.getNumber(); // debug block if (debug) { System.out.println("Box opened: " + bx.getNumber()); System.out.println(keys); } // ------------ } } } if (boxes.size() == 0) { break; } } return answer; }