Bobjoehi

Untitled

Jan 9th, 2021
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.14 KB | None | 0 0
  1. import java.util.*;
  2. import java.io.*;
  3. public class OriginOfLife {
  4.  
  5. static boolean[][] holder;
  6. static boolean[][] life;
  7. static boolean[] generated;
  8. static int row, col;
  9. static ArrayList<ArrayList<Integer>> prev = new ArrayList<ArrayList<Integer>>();
  10.  
  11. static int count(int r, int c) {
  12. int count = 0;
  13. for(int i = r - 1; i <= r + 1; i ++) {
  14. for(int j = c - 1; j <= c + 1; j ++) {
  15. try {
  16. if(holder[i][j]) {
  17. count ++;
  18. }
  19. }catch(ArrayIndexOutOfBoundsException e) {}
  20. }
  21. }
  22. if(holder[r][c]) {
  23. count -= 1;
  24. }
  25. return count;
  26.  
  27. }
  28.  
  29. static void generate(int l, int a, int b, int c) {
  30. if(generated[l]) {
  31. return;
  32. }
  33. toHolder(l);
  34. for(int i = 0; i < row; i ++) {
  35. for(int j = 0; j < col; j ++) {
  36. int count = count(i, j);
  37. if(holder[i][j]) {
  38. if(count < a || count > b) {
  39. life[i][j] = false;
  40. }else {
  41. life[i][j] = holder[i][j];
  42. }
  43. }else {
  44. if(count > c) {
  45. life[i][j] = true;
  46. }else {
  47. life[i][j] = holder[i][j];
  48. }
  49. }
  50. }
  51. }
  52. boolean[][] placeholder = holder;
  53. int next = toInt(life);
  54. prev.get(next).add(l);
  55. holder = life;
  56. life = placeholder;
  57. generated[l] = true;
  58. generate(next, a, b, c);
  59. }
  60.  
  61. static void toHolder(int l) {
  62. int m = 1;
  63.  
  64. for(int i = 0; i < row; i ++) {
  65. for(int j = 0; j < col; j ++) {
  66. if((l & m) != 0) {
  67. holder[i][j] = true;
  68. }else {
  69. holder[i][j] = false;
  70. }
  71. m <<= 1;
  72. }
  73. }
  74. }
  75.  
  76. static int toInt(boolean[][] ar) {
  77. int ret = 0;
  78. for(int i = row - 1; i >= 0; i --) {
  79. for(int j = col - 1; j >= 0; j --) {
  80. ret <<= 1;
  81. if(ar[i][j]) {
  82. ret += 1;
  83. }
  84. }
  85. }
  86. return ret;
  87. }
  88.  
  89. static int bfs(int input) {
  90. Queue<Integer> q = new LinkedList<Integer>();
  91. q.add(input);
  92. int step = 0;
  93. while(!q.isEmpty()) {
  94. int size = q.size();
  95. for(int i = 0; i < size; i ++) {
  96. int curr = q.poll();
  97. if(generated[curr]) {
  98. continue;
  99. }
  100. generated[curr] = true;
  101. if(prev.get(curr).isEmpty()) {
  102. return step;
  103. }else {
  104. for(int v : prev.get(curr)) {
  105. q.add(v);
  106. }
  107. }
  108. }
  109. step ++;
  110. }
  111. return -1;
  112. }
  113.  
  114. public static void main(String[] args) throws IOException{
  115. BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
  116. StringTokenizer st = new StringTokenizer(in.readLine());
  117. row = Integer.parseInt(st.nextToken());
  118. col = Integer.parseInt(st.nextToken());
  119. int a = Integer.parseInt(st.nextToken());
  120. int b = Integer.parseInt(st.nextToken());
  121. int c = Integer.parseInt(st.nextToken());
  122. holder = new boolean[row][col];
  123. life = new boolean[row][col];
  124. generated = new boolean[(int) 1 << (row * col)];
  125.  
  126. for(int i = 0; i < 1 << (row * col); i ++) {
  127. prev.add(new ArrayList<Integer>());
  128. }
  129. for(int i = 0; i < 1 << (row * col); i ++) {
  130. generate(i, a, b, c);
  131. }
  132.  
  133. for(int i = 0; i < row; i ++) {
  134. String inp = in.readLine();
  135. for(int j = 0; j < col; j ++) {
  136. holder[i][j] = inp.charAt(j) == '*';
  137. }
  138. }
  139. Arrays.fill(generated, false);
  140. int input = toInt(holder);
  141. System.out.println(bfs(input));
  142. }
  143. }
Advertisement
Add Comment
Please, Sign In to add comment