Advertisement
Guest User

Untitled

a guest
Aug 30th, 2016
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.60 KB | None | 0 0
  1. import java.util.Scanner;
  2. import java.util.ArrayList;
  3. import java.util.HashMap;
  4. import java.util.stream.Collectors;
  5.  
  6. public class RainfallChallenge
  7. {
  8. public static void main(String[] args)
  9. {
  10. Scanner input = new Scanner(System.in);
  11.  
  12. // building the farm
  13. int size = input.nextInt();
  14. Farm farm = new Farm(size);
  15.  
  16. // setting heights, creating fields
  17. for (int x = 0; x < size; x++)
  18. for (int y = 0; y < size; y++)
  19. farm.putField(x, y, new Field(input.nextInt()));
  20.  
  21. // skynet addon: knows every field as key and maps to the list of all fields of its basin
  22. HashMap<Field, ArrayList<Field>> basins = new HashMap<Field, ArrayList<Field>>();
  23.  
  24. for (int x = 0; x < size; x++)
  25. for (int y = 0; y < size; y++)
  26. groupFields(basins, farm.getField(x, y));
  27.  
  28. // from lists of fields to sorted list of basin sizes
  29. System.out.println(
  30. new StringBuilder(
  31. basins.values()
  32. .stream()
  33. .distinct() // set of field lists
  34. .mapToInt(b -> b.size()) // to their number of fields
  35. .sorted()
  36. .boxed() // in bubble wrap
  37. .map(String::valueOf) // to String stream
  38. .collect(Collectors.joining(" "))).reverse()); // desired order
  39. }
  40.  
  41. private static ArrayList<Field> groupFields(HashMap<Field, ArrayList<Field>> basins, Field field)
  42. {
  43. ArrayList<Field> basin;
  44.  
  45. // end recursion: revisit field
  46. if(basins.containsKey(field))
  47. {
  48. return basins.get(field);
  49. }
  50. // end recursion: new basin
  51. else if(field.getLowestNeighbor() == field)
  52. {
  53. basin = new ArrayList<Field>();
  54. }
  55. // recursion: find basin of lowest neighbor
  56. else
  57. {
  58. basin = groupFields(basins, field.getLowestNeighbor());
  59. }
  60.  
  61. basin.add(field);
  62. basins.put(field, basin);
  63. return basin;
  64. }
  65. }
  66.  
  67. class Farm
  68. {
  69. private Field[][] fields;
  70.  
  71. public Farm(int size)
  72. {
  73. fields = new Field[size][size];
  74. }
  75.  
  76. public void putField(int x, int y, Field field)
  77. {
  78. fields[x][y] = field;
  79.  
  80. // check all 4 neighbors
  81. field.setNeighbor(getField(x + 1, y));
  82. field.setNeighbor(getField(x - 1, y));
  83. field.setNeighbor(getField(x, y + 1));
  84. field.setNeighbor(getField(x, y - 1));
  85. }
  86.  
  87. public Field getField(int x, int y)
  88. {
  89. try
  90. {
  91. return fields[x][y] != null ? fields[x][y] : NullField.instance;
  92. }
  93. catch (IndexOutOfBoundsException e)
  94. {
  95. return NullField.instance;
  96. }
  97. }
  98. }
  99.  
  100. class Field
  101. {
  102. private int height;
  103. private Field lowestNeighbor;
  104.  
  105. public Field(int height)
  106. {
  107. this.height = height;
  108. lowestNeighbor = this;
  109. }
  110.  
  111. public void setNeighbor(Field neighbor)
  112. {
  113. if (neighbor.height < lowestNeighbor.height)
  114. {
  115. lowestNeighbor = neighbor;
  116. }
  117. else if (neighbor.lowestNeighbor.height > height)
  118. {
  119. neighbor.lowestNeighbor = this;
  120. }
  121. }
  122.  
  123. public Field getLowestNeighbor()
  124. {
  125. return lowestNeighbor;
  126. }
  127. }
  128.  
  129. class NullField extends Field
  130. {
  131. public static final NullField instance = new NullField();
  132.  
  133. private NullField()
  134. {
  135. super(Integer.MAX_VALUE);
  136. }
  137. }
  138.  
  139. // from lists of fields to sorted list of basin sizes
  140. System.out.println(
  141. new StringBuilder(
  142. basins.values()
  143. .stream()
  144. .distinct() // set of field lists
  145. .mapToInt(b -> b.size()) // to their number of fields
  146. .sorted()
  147. .boxed() // in bubble wrap
  148. .map(String::valueOf) // to String stream
  149. .collect(Collectors.joining(" "))).reverse()); // desired order
  150.  
  151. public Field getField(int x, int y)
  152. {
  153. try
  154. {
  155. return fields[x][y] != null ? fields[x][y] : NullField.instance;
  156. }
  157. catch (IndexOutOfBoundsException e)
  158. {
  159. return NullField.instance;
  160. }
  161. }
  162.  
  163. class NullField extends Field
  164. {
  165. public static final NullField instance = new NullField();
  166.  
  167. private NullField()
  168. {
  169. super(Integer.MAX_VALUE);
  170. }
  171. }
  172.  
  173. public void setNeighbor(Field neighbor)
  174. {
  175. // pffft, whatever
  176. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement