Advertisement
Guest User

Meepo Challenge

a guest
Oct 15th, 2018
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.70 KB | None | 0 0
  1. MeepoChallenge.java:
  2.  
  3. import java.math.BigInteger;
  4. import java.util.HashMap;
  5.  
  6. public class MeepoChallenge {
  7.  
  8.     public static void main(String[] args) {
  9.  
  10.         HashMap<State, BigInteger> states = new HashMap<State, BigInteger>();
  11.         // Antalet personer
  12.         int n = 1;
  13.         states.put(new State(), BigInteger.ONE);
  14.  
  15.         while (true) {
  16.             // Antalet olika sätt man kan placera n personer på enligt villkoren i
  17.             // uppgiften, alltså t(n).
  18.             BigInteger permutations = BigInteger.ZERO;
  19.             for (BigInteger amounts : states.values()) {
  20.                 permutations = permutations.add(amounts);
  21.             }
  22.             System.out.println("n: " + n + ", t(n): " + permutations);
  23.  
  24.             HashMap<State, BigInteger> nextStates = new HashMap<State, BigInteger>();
  25.             for (State state : states.keySet()) {
  26.                 BigInteger amount = states.get(state);
  27.                 for (State newState : state.getNextStates()) {
  28.                     nextStates.putIfAbsent(newState, BigInteger.ZERO);
  29.                     nextStates.put(newState, nextStates.get(newState).add(amount));
  30.                 }
  31.             }
  32.  
  33.             states = nextStates;
  34.             n++;
  35.         }
  36.     }
  37.  
  38. }
  39.  
  40. State.java:
  41.  
  42. import java.util.ArrayList;
  43. import java.util.Arrays;
  44.  
  45. public class State {
  46.    
  47.     // cols[i] anger hur många personer som står i kolumn i.
  48.     int[] cols;
  49.  
  50.     /**
  51.      * Skapar ett tillstånd med endast en person som står i hörnet.
  52.      */
  53.     public State() {
  54.         cols = new int[] { 1 };
  55.     }
  56.  
  57.     /**
  58.      * Skapar ett tillstånd som är en kopia av parent, antalet kolumner som
  59.      * initialiseras ges av numCols.
  60.      */
  61.     private State(State parent, int numCols) {
  62.         cols = new int[numCols];
  63.         for (int i = 0; i < parent.cols.length; i++) {
  64.             this.cols[i] = parent.cols[i];
  65.         }
  66.     }
  67.  
  68.     /**
  69.      * Lägger till en person i den givna kolumnen. Returnerar det här objektet.
  70.      */
  71.     private State incrementCol(int col) {
  72.         cols[col]++;
  73.         return this;
  74.     }
  75.  
  76.     /**
  77.      * Returnerar en ArrayList av alla godkända tillstånd som kan skapas genom att
  78.      * lägga till en person någonstans i det här tillståndet.
  79.      */
  80.     public ArrayList<State> getNextStates() {
  81.         ArrayList<State> nextStates = new ArrayList<State>();
  82.         nextStates.add(new State(this, this.cols.length).incrementCol(0));
  83.         for (int i = 1; i < cols.length; i++) {
  84.             if (cols[i] < cols[i - 1]) {
  85.                 nextStates.add(new State(this, this.cols.length).incrementCol(i));
  86.             }
  87.         }
  88.         nextStates.add(new State(this, this.cols.length + 1).incrementCol(this.cols.length));
  89.         return nextStates;
  90.     }
  91.  
  92.     @Override
  93.     public int hashCode() {
  94.         int hash = 0;
  95.         for (int i = 0; i < cols.length; i++) {
  96.             hash += i * 35731 * cols[i];
  97.         }
  98.         return hash;
  99.     }
  100.  
  101.     @Override
  102.     public boolean equals(Object obj) {
  103.         if (obj instanceof State) {
  104.             return Arrays.equals(((State) obj).cols, this.cols);
  105.         }
  106.         return false;
  107.     }
  108.  
  109. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement