Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.util.*;
- import java.io.*;
- public class OriginOfLife {
- static boolean[][] holder;
- static boolean[][] life;
- static boolean[] generated;
- static int row, col;
- static ArrayList<ArrayList<Integer>> prev = new ArrayList<ArrayList<Integer>>();
- static int count(int r, int c) {
- int count = 0;
- for(int i = r - 1; i <= r + 1; i ++) {
- for(int j = c - 1; j <= c + 1; j ++) {
- try {
- if(holder[i][j]) {
- count ++;
- }
- }catch(ArrayIndexOutOfBoundsException e) {}
- }
- }
- if(holder[r][c]) {
- count -= 1;
- }
- return count;
- }
- static void generate(int l, int a, int b, int c) {
- if(generated[l]) {
- return;
- }
- toHolder(l);
- for(int i = 0; i < row; i ++) {
- for(int j = 0; j < col; j ++) {
- int count = count(i, j);
- if(holder[i][j]) {
- if(count < a || count > b) {
- life[i][j] = false;
- }else {
- life[i][j] = holder[i][j];
- }
- }else {
- if(count > c) {
- life[i][j] = true;
- }else {
- life[i][j] = holder[i][j];
- }
- }
- }
- }
- boolean[][] placeholder = holder;
- int next = toInt(life);
- prev.get(next).add(l);
- holder = life;
- life = placeholder;
- generated[l] = true;
- generate(next, a, b, c);
- }
- static void toHolder(int l) {
- int m = 1;
- for(int i = 0; i < row; i ++) {
- for(int j = 0; j < col; j ++) {
- if((l & m) != 0) {
- holder[i][j] = true;
- }else {
- holder[i][j] = false;
- }
- m <<= 1;
- }
- }
- }
- static int toInt(boolean[][] ar) {
- int ret = 0;
- for(int i = row - 1; i >= 0; i --) {
- for(int j = col - 1; j >= 0; j --) {
- ret <<= 1;
- if(ar[i][j]) {
- ret += 1;
- }
- }
- }
- return ret;
- }
- static int bfs(int input) {
- Queue<Integer> q = new LinkedList<Integer>();
- q.add(input);
- int step = 0;
- while(!q.isEmpty()) {
- int size = q.size();
- for(int i = 0; i < size; i ++) {
- int curr = q.poll();
- if(generated[curr]) {
- continue;
- }
- generated[curr] = true;
- if(prev.get(curr).isEmpty()) {
- return step;
- }else {
- for(int v : prev.get(curr)) {
- q.add(v);
- }
- }
- }
- step ++;
- }
- return -1;
- }
- public static void main(String[] args) throws IOException{
- BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
- StringTokenizer st = new StringTokenizer(in.readLine());
- row = Integer.parseInt(st.nextToken());
- col = Integer.parseInt(st.nextToken());
- int a = Integer.parseInt(st.nextToken());
- int b = Integer.parseInt(st.nextToken());
- int c = Integer.parseInt(st.nextToken());
- holder = new boolean[row][col];
- life = new boolean[row][col];
- generated = new boolean[(int) 1 << (row * col)];
- for(int i = 0; i < 1 << (row * col); i ++) {
- prev.add(new ArrayList<Integer>());
- }
- for(int i = 0; i < 1 << (row * col); i ++) {
- generate(i, a, b, c);
- }
- for(int i = 0; i < row; i ++) {
- String inp = in.readLine();
- for(int j = 0; j < col; j ++) {
- holder[i][j] = inp.charAt(j) == '*';
- }
- }
- Arrays.fill(generated, false);
- int input = toInt(holder);
- System.out.println(bfs(input));
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment