Guest User

Untitled

a guest
Mar 17th, 2018
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.72 KB | None | 0 0
  1. import java.util.*;
  2.  
  3. class Main {
  4. public static void main(String[] args) {
  5. Scanner sc = new Scanner(System.in);
  6. int n = sc.nextInt();
  7. int m = sc.nextInt();
  8. char[][] board = new char[n][m];
  9. for (int a = 0; a < n; a++) {
  10. String s = sc.next();
  11. for (int b = 0; b < m; b++) {
  12. board[a][b] = s.charAt(b);
  13. }
  14. }
  15. int answer = 11;
  16. int count = 1;
  17. answer = Math.min(answer, left(count, board, n, m));
  18. answer = Math.min(answer, right(count, board, n, m));
  19. answer = Math.min(answer, up(count, board, n, m));
  20. answer = Math.min(answer, down(count, board, n, m));
  21. if (answer == 11) {
  22. System.out.println(-1);
  23. } else {
  24. System.out.println(answer);
  25. }
  26. sc.close();
  27. }
  28.  
  29. private static int up(int count, char[][] board, int n, int m) {
  30. char[][] newboard = new char[n][m];
  31. for (int f = 0; f < n; f++) {
  32. for (int g = 0; g < m; g++) {
  33. newboard[f][g] = board[f][g];
  34. }
  35. }
  36. boolean candidate = false;
  37. if (count == 11) {
  38. return count;
  39. } else {
  40. for (int a = 1; a < n - 1; a++) {
  41. for (int b = 1; b < m - 1; b++) {
  42. if (newboard[a][b] == 'R' || newboard[a][b] == 'B') {
  43. char ch = newboard[a][b];
  44. for (int c = a - 1; c >= 0; c--) {
  45. if (newboard[c][b] == 'O') {
  46. if (ch == 'B') {
  47. return 11;
  48. } else {
  49. candidate = true;
  50. newboard[a][b] = '.';
  51. break;
  52. }
  53. } else if (newboard[c][b] != '.') {
  54. char temp = newboard[c + 1][b];
  55. newboard[c + 1][b] = newboard[a][b];
  56. newboard[a][b] = temp;
  57. break;
  58. }
  59. }
  60. }
  61. }
  62. }
  63. }
  64. if (candidate) {
  65. return count;
  66. } else {
  67. return Math.min(left(count + 1, newboard, n, m), right(count + 1, newboard, n, m));
  68. }
  69. }
  70.  
  71. private static int down(int count, char[][] board, int n, int m) {
  72. char[][] newboard = new char[n][m];
  73. for (int f = 0; f < n; f++) {
  74. for (int g = 0; g < m; g++) {
  75. newboard[f][g] = board[f][g];
  76. }
  77. }
  78. boolean candidate = false;
  79. if (count == 11) {
  80. return count;
  81. } else {
  82. for (int a = n - 2; a > 0; a--) {
  83. for (int b = 1; b < m - 1; b++) {
  84. if (newboard[a][b] == 'R' || newboard[a][b] == 'B') {
  85. char ch = newboard[a][b];
  86. for (int c = a + 1; c < n; c++) {
  87. if (newboard[c][b] == 'O') {
  88. if (ch == 'B') {
  89. return 11;
  90. } else {
  91. candidate = true;
  92. newboard[a][b] = '.';
  93. break;
  94. }
  95. } else if (newboard[c][b] != '.') {
  96. char temp = newboard[c - 1][b];
  97. newboard[c - 1][b] = newboard[a][b];
  98. newboard[a][b] = temp;
  99. break;
  100. }
  101. }
  102. }
  103. }
  104. }
  105. }
  106. if (candidate) {
  107. return count;
  108. } else {
  109. return Math.min(left(count + 1, newboard, n, m), right(count + 1, newboard, n, m));
  110. }
  111. }
  112.  
  113. private static int right(int count, char[][] board, int n, int m) {
  114. char[][] newboard = new char[n][m];
  115. for (int f = 0; f < n; f++) {
  116. for (int g = 0; g < m; g++) {
  117. newboard[f][g] = board[f][g];
  118. }
  119. }
  120. boolean candidate = false;
  121. if (count == 11) {
  122. return count;
  123. } else {
  124. for (int a = 1; a < n - 1; a++) {
  125. for (int b = m - 2; b > 0; b--) {
  126. if (newboard[a][b] == 'R' || newboard[a][b] == 'B') {
  127. char ch = newboard[a][b];
  128. for (int c = b + 1; c < m; c++) {
  129. if (newboard[a][c] == 'O') {
  130. if (ch == 'B') {
  131. return 11;
  132. } else {
  133. candidate = true;
  134. newboard[a][b] = '.';
  135. break;
  136. }
  137. } else if (newboard[a][c] != '.') {
  138. char temp = newboard[a][c - 1];
  139. newboard[a][c - 1] = newboard[a][b];
  140. newboard[a][b] = temp;
  141. break;
  142. }
  143. }
  144. }
  145. }
  146. }
  147. }
  148. if (candidate) {
  149. return count;
  150. } else {
  151. return Math.min(up(count + 1, newboard, n, m), down(count + 1, newboard, n, m));
  152. }
  153. }
  154.  
  155. private static int left(int count, char[][] board, int n, int m) {
  156. char[][] newboard = new char[n][m];
  157. for (int f = 0; f < n; f++) {
  158. for (int g = 0; g < m; g++) {
  159. newboard[f][g] = board[f][g];
  160. }
  161. }
  162. boolean candidate = false;
  163. if (count == 11) {
  164. return count;
  165. } else {
  166. for (int a = 1; a < n - 1; a++) {
  167. for (int b = 1; b < m - 1; b++) {
  168. if (newboard[a][b] == 'R' || newboard[a][b] == 'B') {
  169. char ch = newboard[a][b];
  170. for (int c = b - 1; c >= 0; c--) {
  171. if (newboard[a][c] == 'O') {
  172. if (ch == 'B') {
  173. return 11;
  174. } else {
  175. candidate = true;
  176. newboard[a][b] = '.';
  177. break;
  178. }
  179. } else if (newboard[a][c] != '.') {
  180. char temp = newboard[a][c + 1];
  181. newboard[a][c + 1] = newboard[a][b];
  182. newboard[a][b] = temp;
  183. break;
  184. }
  185. }
  186. }
  187. }
  188. }
  189. }
  190. if (candidate) {
  191. return count;
  192. } else {
  193. return Math.min(up(count + 1, newboard, n, m), down(count + 1, newboard, n, m));
  194. }
  195. }
  196. }
Add Comment
Please, Sign In to add comment