Advertisement
Guest User

Untitled

a guest
Sep 16th, 2019
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.09 KB | None | 0 0
  1. public class SortCities2 {
  2.  
  3. private Chain solution;
  4.  
  5. /*
  6. Першим містом обирається перший елемент в списку.
  7. Можливість вирішення задачі залежить від першого обраного міста.
  8. */
  9. public List<String> solveCitiesGame(List<String> allCitiesList) {
  10. List<Chain> chains = new ArrayList<>();
  11. for(String city : allCitiesList){
  12. chains.add(new Chain(city));
  13. }
  14. mergeChains(chains);
  15. if(solution == null) throw new IllegalStateException("Solution not found");
  16. return solution.getElements();
  17. }
  18.  
  19. private boolean isSolvable(List<Chain> chains){
  20. Map<Character, Integer> firstLetters = new HashMap<>();
  21. Map<Character, Integer> lastLetters = new HashMap<>();
  22. chains.forEach(chain -> {
  23. char first = chain.getFirstChar();
  24. char last = chain.getLastChar();
  25. if(!firstLetters.containsKey(first)){
  26. firstLetters.put(first, 0);
  27. }else{
  28. int firstCount = firstLetters.get(chain.getFirstChar());
  29. firstLetters.put(first, ++firstCount);
  30. }
  31. if(!lastLetters.containsKey(last)){
  32. lastLetters.put(last, 0);
  33. }else{
  34. int lastCount = lastLetters.get(chain.getLastChar());
  35. lastLetters.put(last, ++lastCount);
  36. }
  37. });
  38. int missCount = 0;
  39. for(Character letter : firstLetters.keySet()){
  40. if(!lastLetters.containsKey(letter) || !firstLetters.get(letter).equals(lastLetters.get(letter))){
  41. missCount++;
  42. }
  43. }
  44. for(Character letter : lastLetters.keySet()){
  45. if(!firstLetters.containsKey(letter)) missCount++;
  46. }
  47. return missCount == 2 || missCount == 0;
  48. }
  49.  
  50. private boolean mergeChains(List<Chain> chains){
  51. if(chains.size() == 1){
  52. solution = chains.get(0);
  53. return true;
  54. }
  55.  
  56. Chain first = chains.remove(0);
  57. List<Chain> possibleSeconds = chains.stream().filter(chain -> chain.getFirstChar() == first.getLastChar())
  58. .collect(Collectors.toList());
  59. for (Chain possibleSecond : possibleSeconds){
  60. List<String> firstElements = first.getElements();
  61. List<String> secondElements = possibleSecond.getElements();
  62. List<String> newFirstElements = new ArrayList<>(firstElements);
  63. newFirstElements.addAll(secondElements);
  64. Chain newFirst = new Chain(newFirstElements);
  65. List<Chain> possibleSolution = new ArrayList<>();
  66. possibleSolution.add(newFirst);
  67. possibleSolution.addAll(chains);
  68. possibleSolution.remove(possibleSecond);
  69. if(isSolvable(possibleSolution) && mergeChains(possibleSolution)){
  70. return true;
  71. }
  72. }
  73. return false;
  74. }
  75.  
  76. /* Методи для генерування випадкових назв міст
  77.  
  78. public List<String> generateRandomNames(int count){
  79. List<String> names = new ArrayList<>();
  80. char letter = 'a';
  81. for (int i = 0; i < count; i++) {
  82. String name = generateRandomName(letter);
  83. names.add(name);
  84. letter = name.charAt(name.length() - 1);
  85. }
  86. String firstName = names.remove(0);
  87. Collections.shuffle(names);
  88. names.add(0, firstName);
  89. return names;
  90. }
  91.  
  92. public String generateRandomName(char firstLetter) {
  93. int leftLimit = 97;
  94. int rightLimit = 122;
  95. int targetStringLength = 6;
  96. Random random = new Random();
  97. StringBuilder buffer = new StringBuilder(targetStringLength);
  98. buffer.append(firstLetter);
  99. for (int i = 0; i < targetStringLength; i++) {
  100. int randomLimitedInt = leftLimit + (int)
  101. (random.nextFloat() * (rightLimit - leftLimit + 1));
  102. buffer.append((char) randomLimitedInt);
  103. }
  104. return buffer.toString();
  105. }
  106.  
  107. */
  108.  
  109. public static void main(String[] args) {
  110. SortCities2 sortCities2 = new SortCities2();
  111. long t1 = System.currentTimeMillis();
  112. List<String> solution = sortCities2.solveCitiesGame(Arrays.asList("London", "Aurora", "Naga", "Aswan"));
  113. long t2 = System.currentTimeMillis();
  114. System.out.println("Time: " + (t2 - t1));
  115. System.out.println("Solution: " + solution);
  116. }
  117.  
  118. }
  119.  
  120. class Chain{
  121.  
  122. private List<String> elements;
  123.  
  124. public Chain(String element){
  125. elements = new ArrayList<>(Collections.singletonList(element));
  126. }
  127.  
  128. public Chain(List<String> elements){
  129. this.elements = new ArrayList<>(elements);
  130. }
  131.  
  132. public char getFirstChar(){
  133. return Character.toLowerCase(elements.get(0).charAt(0));
  134. }
  135.  
  136. public char getLastChar(){
  137. String lastElement = elements.get(elements.size() - 1);
  138. return Character.toLowerCase(lastElement.charAt(lastElement.length() - 1));
  139. }
  140.  
  141. public List<String> getElements() {
  142. return elements;
  143. }
  144.  
  145. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement