#include #include #define MAX_DIM 11 #define FALSE 0 #define TRUE 1 int project(int view); void punch(int view); void rotate(); void init(); void init_cube(); void readset(); void solveset(); void showcube(); int Cube[MAX_DIM][MAX_DIM][MAX_DIM]; int View[3][MAX_DIM][MAX_DIM]; int size; int main (void) { init(); for (;;) { if (feof(stdin)) break; init_cube(); readset(); solveset(); } return 0; } void solveset() { int i,j,k; int exists = FALSE; char answer[4] = "YES"; // Create object showcube(); punch(0); rotate(); showcube(); punch(1); rotate(); showcube(); punch(2); rotate(); showcube(); // Create test projections if (!project(0)) strcpy(answer, "NO"); rotate(); if (!project(1)) strcpy(answer, "NO"); rotate(); if (!project(2)) strcpy(answer, "NO"); rotate(); // Check for non-existant crystal for (i = 0; i < size; i++) { for (j = 0; j < size; j++) { for (k = 0; k < size; k++) { if (Cube[i][j][k] == 'X') exists = TRUE; } } } if (!exists) strcpy(answer, "NO"); fprintf(stdout,"%s\n",answer); } void readset() { int i,j,k; char line[MAX_DIM]; fscanf(stdin," START %d ", &size); /* fprintf(stdout,"Size is %d\n", size); */ for (i = 0; i < 3; i++) { for (j = size-1; j >=0; j--) { fscanf(stdin,"%s",line); for (k = 0; k < size; k++) { View[i][j][k] = line[k]; } } } fscanf(stdin," END "); /* fprintf(stdout,"Found and end for %d\n", size);*/ } void init_cube() { int i,j,k; for (i = 0; i < MAX_DIM; i++) { for (j = 0; j < MAX_DIM; j++) { for (k = 0; k < MAX_DIM; k++) { Cube[i][j][k] = 'X'; } } } } void init() { } void rotate() { int temp_cube[MAX_DIM][MAX_DIM][MAX_DIM]; int i,j,k; for (i = 0; i < size; i++) { for (j = 0; j < size; j++) { for (k = 0; k < size; k++) { temp_cube[i][j][k] = Cube[k][i][j]; } } } for (i = 0; i < size; i++) { for (j = 0; j < size; j++) { for (k = 0; k < size; k++) { Cube[i][j][k] = temp_cube[i][j][k]; } } } } void punch(int view) { //Punch view int i,j,k; for (i = 0; i < size; i++) { for (j = 0; j < size; j++) { if (View[view][i][j] == 'O') { for (k = 0; k < size; k++) { Cube[k][i][j] = 'O'; } } } } } int project(int view) { //Project view int i,j,k; int piece; for (i = 0; i < size; i++) { for (j = 0; j < size; j++) { piece = 0; for (k = 0; k < size; k++) { if (Cube[k][i][j] == 'X') piece = 1; } if (piece == 1) { if (View[view][i][j] != 'X') return FALSE; } else { if (View[view][i][j] != 'O') return FALSE; } } } return TRUE; } void showcube() { int i,j,k; char disp; for (i = size-1; i >= 0; i--) { for (j = 0; j < size; j++) { disp = 'O'; for (k = 0; k < size; k++) { if (Cube[k][i][j] == 'X') disp = 'X'; } /* fprintf(stdout,"%c",disp);*/ } /*fprintf(stdout,"\n");*/ } }