fork download
  1.  
  2. import java.util.*;
  3. import java.lang.*;
  4. import java.io.*;
  5.  
  6. class Ideone
  7. {
  8. public static void main (String[] args) throws java.lang.Exception
  9. {
  10. Set<Xyz> l1 = new HashSet<>();
  11. for (int i = 1; i <= 9; i++)
  12. l1.add(new Xyz(i, i, i));
  13. for (int i = 1; i <= 7; i++)
  14. l1.add(new Xyz(i, i + 1, i + 2));
  15.  
  16. Set<Xyz> l2 = new HashSet<>();
  17. for (Xyz x1 : l1)
  18. for (Xyz x2 : l1) {
  19. Xyz x3 = x1.addNew(x2);
  20. if (x3 != null)
  21. l2.add(x3);
  22. }
  23.  
  24. Set<Xyz> l4 = new HashSet<>();
  25. for (Xyz x1 : l2)
  26. for (Xyz x2 : l2) {
  27. Xyz x3 = x1.addNew(x2);
  28. if (x3 != null)
  29. l4.add(x3);
  30. }
  31.  
  32. Set<Xyz> lh = new HashSet<>();
  33. for (int i = 1; i <= 9; i++)
  34. lh.add(new Xyz(i));
  35.  
  36. Set<Xyz> l5 = new HashSet<>();
  37. for (Xyz x1 : l4)
  38. for (Xyz x2 : lh) {
  39. Xyz x3 = x1.addNew(x2);
  40. if (x3 != null)
  41. l5.add(x3);
  42. }
  43.  
  44. int[] d = new int[11];
  45.  
  46. Scanner in = new Scanner(System.in);
  47. String line = in.next();
  48. for (int i = 0; i < line.length(); i++) {
  49. d[Integer.parseInt(line.substring(i, i + 1))]++;
  50. }
  51.  
  52. Set<String> answer = new HashSet<>();
  53.  
  54. for (int i = 1; i <= 9; i++) {
  55. d[i]++;
  56. for (Xyz x : l5) {
  57. if (x.match(d)) {
  58. List<String> ls = x.erase(Integer.toString(i));
  59. for (String s : ls)
  60. answer.add(s);
  61. }
  62. }
  63. d[i]--;
  64. }
  65.  
  66. for (String s : answer)
  67. System.out.println(s);
  68. }
  69. }
  70.  
  71. class Xyz
  72. {
  73. String[] m;
  74. int[] c;
  75. int l;
  76. Xyz() {
  77. m = new String[5];
  78. c = new int[11];
  79. l = 0;
  80. }
  81. Xyz(int x, int y, int z) {
  82. this();
  83. add(x, y, z);
  84. }
  85. Xyz(int x) {
  86. this();
  87. add(x);
  88. }
  89. Xyz(Xyz xyz) {
  90. m = Arrays.copyOf(xyz.m, xyz.m.length);
  91. c = Arrays.copyOf(xyz.c, xyz.c.length);
  92. l = xyz.l;
  93. }
  94. boolean match(int[] d) {
  95. return Arrays.equals(c, d);
  96. }
  97. boolean add(int x, int y, int z) {
  98. if (l == 5) return false;
  99. if (x == y && c[x] > 1) return false;
  100. if (c[x] > 3 || c[y] > 3 || c[z] > 3) return false;
  101. m[l++] = Integer.toString(x * 100 + y * 10 + z);
  102. Arrays.sort(m, 0, l);
  103. c[x]++; c[y]++; c[z]++;
  104. return true;
  105. }
  106. boolean add(int x) {
  107. if (l == 5) return false;
  108. if (c[x] > 2) return false;
  109. m[l++] = Integer.toString(x * 10 + x);
  110. Arrays.sort(m, 0, l);
  111. c[x] += 2;
  112. return true;
  113. }
  114. boolean add(Xyz xyz) {
  115. if (l + xyz.l > 5) return false;
  116. for (int i = 1; i < 10; i++) {
  117. if (c[i] + xyz.c[i] > 4) return false;
  118. }
  119. for (int i = 0; i < xyz.l; i++) {
  120. m[i + l] = xyz.m[i];
  121. }
  122. l += xyz.l;
  123. Arrays.sort(m, 0, l);
  124. for (int i = 1; i < 10; i++) {
  125. c[i] += xyz.c[i];
  126. }
  127. return true;
  128. }
  129. Xyz addNew(Xyz o) {
  130. Xyz xyz = new Xyz(this);
  131. if(xyz.add(o))
  132. return xyz;
  133. else
  134. return null;
  135. }
  136. List<String> erase(String k) {
  137. List<String> ls = new ArrayList<>();
  138. for (int i = 0; i < l; i++) {
  139. if (m[i].indexOf(k) < 0) continue;
  140. String x = "";
  141. for (int j = 0; j < l; j++)
  142. if (j == i)
  143. x += "[" + m[j].replaceFirst(k, "") + "]";
  144. else
  145. x += "(" + m[j] + ")";
  146. ls.add(x);
  147. }
  148. return ls;
  149. }
  150. public int hashCode() {
  151. return Arrays.hashCode(m);
  152. }
  153. public boolean equals(Object o){
  154. Xyz xyz = (Xyz)o;
  155. return Arrays.equals(m, xyz.m);
  156. }
  157. public String toString() {
  158. return Arrays.toString(m);
  159. }
  160. }
Success #stdin #stdout 0.26s 321408KB
stdin
1112345678999
stdout
(11)[12](345)(678)(999)
(111)(234)(567)[8](999)
(111)(234)(567)[89](99)
[11](123)(456)(789)(99)
(111)[2](345)(678)(999)
(111)[23](456)(789)(99)
(111)(234)[56](789)(99)
(11)(123)[45](678)(999)
(111)(234)[5](678)(999)
(11)(123)(456)(789)[99]
(11)(123)(456)[78](999)