Example #1
0
 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;
 }
Example #2
0
  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;
  }