fork download
  1. /* package whatever; // don't place package name! */
  2.  
  3. import java.util.*;
  4. import java.lang.*;
  5. import java.io.*;
  6.  
  7. /* Name of the class has to be "Main" only if the class is public. */
  8. class Ideone
  9. {
  10. public static void main(String[] args)
  11. {
  12. Ideone solver = new Ideone(
  13. "煩悩煩悩煩煩悩煩\n" +
  14. "煩煩悩空悩悩悩悩\n" +
  15. "悩空悩空悩空悩煩\n" +
  16. "空煩煩悩悩悩煩煩\n" +
  17. "悩悩悩煩悩煩煩悩\n" +
  18. "煩悩空空悩煩悩煩\n" +
  19. "煩煩煩悩煩空悩煩");
  20. solver.solve();
  21. }
  22.  
  23. static final long BLOCK_MASK = 0b1100000011L;
  24. final long bon;
  25. final long bon_mask;
  26. final long nou;
  27. final long nou_mask;
  28.  
  29. long result;
  30. int limit;
  31.  
  32. Ideone(String s)
  33. {
  34. int i = 0;
  35. long bon = 0;
  36. long nou = 0;
  37. for (char c : s.toCharArray())
  38. {
  39. switch (c)
  40. {
  41. case '煩': bon |= 1L << i; break;
  42. case '悩': nou |= 1L << i; break;
  43. // 修正ここから
  44. case '空': break;
  45. case '\r': case '\n': continue;
  46. // 修正ここまで
  47. // case '空': case '\r': case '\n': break; // バグコード
  48. default: throw new IllegalArgumentException();
  49. }
  50. i++;
  51. }
  52. long bonnou = bon | nou;
  53. long mask = 0L;
  54. // 煩悩を消す必要がある部分を調べる
  55. for (i = 0; i < 47; i++)
  56. {
  57. if ((i & 0x7) == 7) i++;
  58. if ((bon & BLOCK_MASK << i) != 0 && (nou & BLOCK_MASK << i) != 0)
  59. {
  60. mask |= BLOCK_MASK << i;
  61. }
  62. }
  63. mask &= bonnou;
  64. this.bon = bon;
  65. this.bon_mask = bon & mask;
  66. this.nou = nou;
  67. this.nou_mask = nou & mask;
  68.  
  69. // 最悪煩か悩のどちらかを全て消せば煩悩にならない。
  70. int b = Long.bitCount(bon_mask);
  71. int n = Long.bitCount(nou_mask);
  72. if (b <= n)
  73. {
  74. limit = b;
  75. result = bon_mask;
  76. }
  77. else
  78. {
  79. limit = n;
  80. result = nou_mask;
  81. }
  82. }
  83.  
  84. void solve()
  85. {
  86. foo(0L, 0);
  87. System.out.printf("鐘の数は %d 個です%nbefore:%n%s%n%nafter:%n%s%n", limit, toString(), toString(result));
  88. }
  89.  
  90. void foo(long remove, int i)
  91. {
  92. int count = Long.bitCount(remove);
  93. if (count < limit)
  94. {
  95. while (i < 47)
  96. {
  97. if ((i & 7) == 7) i++;
  98. long block_mask = BLOCK_MASK << i;
  99.  
  100. // 2x2ブロック内に煩と悩がある場合
  101. // if ((bon_mask & block_mask & ~remove) != 1 && (nou_mask & block_mask & ~remove) != 1) // バグコード なんで1になってたんだw
  102. if ((bon_mask & block_mask & ~remove) != 0 && (nou_mask & block_mask & ~remove) != 0)
  103. {
  104. foo(remove | bon_mask & block_mask, i + 1); // ブロック内の煩を消して進めてみる
  105. foo(remove | nou_mask & block_mask, i + 1); // ブロック内の悩を消して進めてみる
  106. return;
  107. }
  108.  
  109. // 煩悩が無かったら次のブロックに進める
  110. i++;
  111. }
  112.  
  113. result = remove;
  114. limit = count;
  115. }
  116. }
  117.  
  118. @Override
  119. public String toString()
  120. {
  121. return toString(0L);
  122. }
  123.  
  124. public String toString(long remove)
  125. {
  126. StringBuilder sb = new StringBuilder();
  127. for(int i = 0; i < 56; i++)
  128. {
  129. if ((remove & 1L << i) != 0) sb.append("鐘");
  130. else if ((bon & 1L << i) != 0) sb.append("煩");
  131. else if ((nou & 1L << i) != 0) sb.append("悩");
  132. else sb.append("空");
  133. if ((i & 7) == 7 & i != 55) sb.append("\n");
  134. }
  135. return sb.toString();
  136. }
  137. }
Success #stdin #stdout 0.09s 380160KB
stdin
Standard input is empty
stdout
鐘の数は 22 個です
before:
煩悩煩悩煩煩悩煩
煩煩悩空悩悩悩悩
悩空悩空悩空悩煩
空煩煩悩悩悩煩煩
悩悩悩煩悩煩煩悩
煩悩空空悩煩悩煩
煩煩煩悩煩空悩煩

after:
鐘悩鐘悩鐘鐘悩鐘
鐘鐘悩空悩悩悩悩
悩空悩空悩空悩鐘
空鐘鐘悩悩悩鐘鐘
悩悩悩鐘悩鐘鐘悩
鐘鐘空空悩鐘悩鐘
煩煩鐘悩鐘空悩鐘