#include #include #include typedef int bool; #define TRUE 1 #define FALSE 0 char puzzle[17][17]; void read_input(void) { for (int i = 0; i < 17; i++) { char buffer[40]; fgets(buffer, 39, stdin); int len = strlen(buffer); while (len > 0 && buffer[len-1] < ' ') len--; int s = i - 8; for (int j = 0; j < 17; j++, s += 2) if (s < 0 || s >= len) puzzle[i][j] = ' '; else puzzle[i][j] = buffer[s]; } } void print_input(void) { for (int i = 0; i < 17; i++) { for (int j = 0; j < 17; j++) printf("%c", puzzle[i][j]); printf("\n"); } } char puzzle_value(int i, int j) { return i < 0 || i >= 17 || j < 0 || j >= 17 ? ' ' : puzzle[i][j]; } int d_i[6] = { 0, 1, 1, 0, -1, -1 }; int d_j[6] = { 1, 0, -1, -1, 0, 1 }; int n = 0; int nr_loc = 0; int number[17][17][7]; void fill_number(void) { for (int i = 0; i < 17; i++) for (int j = 0; j < 17; j++) for (int d = 0; d < 7; d++) number[i][j][d] = -1; for (int i = 0; i < 17; i++) for (int j = 0; j < 17; j++) if (puzzle_value(i, j) != ' ') number[i][j][0] = n++; nr_loc = n; for (int i = 0; i < 17; i++) for (int j = 0; j < 17; j++) if (puzzle_value(i, j) != ' ') for (int d = 0; d < 3; d++) { int i1 = i + d_i[d]; int j1 = j + d_j[d]; if (puzzle_value(i1, j1) != ' ') { number[i ][j ][1 + d] = n; number[i1][j1][4 + d] = n; for (int c = 0; c < 4; c++, n++) printf("%d\n", n); } } //printf("n = %d\n", n); } int p_i[10]; int p_j[10]; int nr_p; void find_piece(int i, int j, char col) { for (int d = 0; d < nr_p; d++) if (p_i[d] == i && p_j[d] == j) return; if (puzzle_value(i, j) != col) return; p_i[nr_p] = i; p_j[nr_p] = j; nr_p++; find_piece(i+1, j, col); find_piece(i, j+1, col); find_piece(i-1, j+1, col); find_piece(i-1, j, col); find_piece(i, j-1, col); find_piece(i+1, j-1, col); } int compare_ints(const void *a, const void *b) { int int_a = *(int *)a; int int_b = *(int *)b; return int_a - int_b; } int nr_pieces = 0; void place_piece(int col) { int col_nr = col == 'b' ? 0 : col == 'o' ? 1 : col == 'p' ? 2 : 3; for (int d = 0; d < 6; d++) { for (int i = 0; i < 17; i++) for (int j = 0; j < 17; j++) if (puzzle_value(i, j) != ' ') { bool possible = TRUE; for (int p = 1; p < nr_p; p++) if (puzzle_value(i + p_i[p], j + p_j[p]) == ' ') { possible = FALSE; break; } if (possible) { int positions[200]; int nr_positions = 1; positions[0] = n; for (int p = 0; p < nr_p; p++) { int i1 = i + p_i[p]; int j1 = j + p_j[p]; positions[nr_positions++] = number[i1][j1][0]; for (int d = 0; d < 6; d++) if (number[i1][j1][1 + d] >= 0) { bool outside = TRUE; int i2 = i1 + d_i[d]; int j2 = j1 + d_j[d]; for (int p2 = 0; p2 < nr_p; p2++) if (i2 == i + p_i[p2] && j2 == j + p_j[p2]) { outside = FALSE; break; } if (outside) positions[nr_positions++] = number[i1][j1][1 + d] + col_nr; } } qsort(positions, nr_positions, sizeof(int), compare_ints); printf("%d", positions[0]); for (int i = 1; i < nr_positions; i++) printf(",%d", positions[i]); char sep = ' '; for (int i = 0; i < nr_positions; i++) if (positions[i] < nr_loc) { printf("%c%c%d", sep, col, positions[i]); sep = '|'; } printf("\n"); /* if (nr_pieces == 1) { char sep = '['; for (int i = 0; i < nr_positions; i++) if (positions[i] < nr_loc) { printf("%c%d", sep, positions[i]); sep = ','; } printf("],\n"); }*/ } } for (int p = 1; p < nr_p; p++) { int i = p_i[p]; int j = p_j[p]; p_i[p] = i + j; p_j[p] = -i; } if (nr_pieces == 1) break; } n++; nr_pieces++; } void find_all_pieces(void) { int nr_pieces = 0; for (int i = 0; i < 17; i++) for (int j = 0; j < 17; j++) { char col = puzzle[i][j]; if (col != ' ') { nr_p = 0; find_piece(i, j, col); bool good = TRUE; for (int p = 1; p < nr_p; p++) { p_i[p] -= p_i[0]; p_j[p] -= p_j[0]; if (p_i[p] < 0 || (p_i[p] == 0 && p_j[p] < 0)) { good = FALSE; break; } } p_i[0] = 0; p_j[0] = 0; if (good) { place_piece(col); nr_pieces++; } } } //printf("nr_pieces = %d\n", nr_pieces); } void process_output(void) { FILE *f = fopen("ec_sols.txt", "r"); if (f == NULL) return; char buffer[10000]; while (fgets(buffer, 999, f)) { char result[1100]; for (int i = 0; i < 1100; i++) result[i] = '\0'; for (char *s = buffer; *s > ' '; s++) { char col = *s++; int pos = 0; while ('0' <= *s && *s <= '9') pos = 10 * pos + *s++ - '0'; if (col < 1100) result[pos] = col; } printf("\"%s\",\n", result); } fclose(f); } int main(int argc, char *argv[]) { if (argc > 1) { process_output(); return 0; } read_input(); //print_input(); fill_number(); find_all_pieces(); return 0; }