class RB { final static int N = 100; final static int T = 10; final static double C = 0.5; final static int root = 0; static char m[][] = new char[N][N]; static void rand_fill(char c, int n) { while (n-- > 0) { int i, j; do { i = BSDRand.rand(N); j = BSDRand.rand(N); } while (m[j][i] != ' '); m[j][i] = c; } } static void zero_array() { for (int i = 0; i < N; i++) for (int j = 0; j < N; j++) m[j][i] = ' '; } static void init_array() { zero_array(); rand_fill('r', N * N / 4); rand_fill('b', N * N / 4); } static void print_array() { int i, j; char[] line = new char[N]; for (j = 0; j < N; j++) { for (i = 0; i < N; i++) { line[i] = m[j][i]; } System.out.println(line); } } static int count_cells(int c, int ti, int tj) { int cnt = 0; ti *= T; tj *= T; for (int i = 0; i < T; i++) for (int j = 0; j < T; j++) if (m[tj + j][ti + i] == c) cnt++; return cnt; } public static void main(String[] args) { boolean show = false, red_moved, blue_moved; int cnt = 0, n; n = Integer.valueOf(args[0]); BSDRand.srand(n); init_array(); show = (args.length > 1); if (show) System.out.println(N); do { if (show) print_array(); /* Check regions: */ { boolean done = false; for (int k = 0; k < (N/T)*(N/T); k++) { int i = k % (N/T); int j = k / (N/T); int rc = count_cells('r', i, j); int bc = count_cells('b', i, j); if ((rc > (T * T * C)) || (bc > (T * T * C))) done = true; } if (done) break; } red_moved = false; for (int j = 0; j < N; j++) { boolean left_white = (m[j][0] == ' '); int i; for (i = 0; i < N-1; i++) { if ((m[j][i] == 'r') && (m[j][i+1] == ' ')) { m[j][i] = ' '; m[j][i+1] = 'r'; red_moved = true; i++; /* don't move again */ } } if (i < N) { if ((m[j][N-1] == 'r') && left_white) { m[j][N-1] = ' '; m[j][0] = 'r'; red_moved = true; } } } blue_moved = false; for (int i = 0; i < N; i++) { boolean top_white = (m[0][i] == ' '); int j; for (j = 0; j < N-1; j++) { if ((m[j][i] == 'b') && (m[j+1][i] == ' ')) { m[j][i] = ' '; m[j+1][i] = 'b'; blue_moved = true; j++; /* don't move again */ } } if (j < N) { if ((m[N-1][i] == 'b') && top_white) { m[N-1][i] = ' '; m[0][i] = 'b'; blue_moved = true; } } } cnt++; } while (red_moved || blue_moved); if (!show) System.out.println(cnt); } }