// @BEGIN_OF_SOURCE_CODE /* @JUDGE_ID: 17243NT 197 C++ */ // Send to judge@uva.es #include #include #ifdef ONLINE_JUDGE #define ins cin #define outs cout #else #define ins fin #define outs fout ifstream fin("myprog.in"); ofstream fout("myprog.out"); #endif #define bit(a, b) (a & (1 << b)) int picked[7], current; int npieces[7], pieces[7][150]; bool translate(int &piece, int t1, int t2, int t3); void rotate(int &piece, int dir); void piecea(int piece); void piecerest(int n, int piece); int encodestr(char *str); void putpiece(int n); bool translate(int &piece, int t1, int t2, int t3) { int tp, x, y, z; tp = 0; for(x = 0; x < 3; x++) for(y = 0; y < 3; y++) for(z = 0; z < 3; z++) if(bit(piece, 9 * x + 3 * y + z)) { if(x + t1 < 0 || 3 <= x + t1) return false; if(y + t2 < 0 || 3 <= y + t2) return false; if(z + t3 < 0 || 3 <= z + t3) return false; tp += 1 << (9 * (x + t1) + 3 * (y + t2) + (z + t3)); } piece = tp; return true; } void rotate(int &piece, int dir) { int i, tp; tp = 0; if(dir == 0) { for(i = 0; i < 3; i++) { if(bit(piece, 9 * i + 0)) tp += 1 << (9 * i + 2); if(bit(piece, 9 * i + 1)) tp += 1 << (9 * i + 5); if(bit(piece, 9 * i + 2)) tp += 1 << (9 * i + 8); if(bit(piece, 9 * i + 3)) tp += 1 << (9 * i + 1); if(bit(piece, 9 * i + 4)) tp += 1 << (9 * i + 4); if(bit(piece, 9 * i + 5)) tp += 1 << (9 * i + 7); if(bit(piece, 9 * i + 6)) tp += 1 << (9 * i + 0); if(bit(piece, 9 * i + 7)) tp += 1 << (9 * i + 3); if(bit(piece, 9 * i + 8)) tp += 1 << (9 * i + 6); } } else if(dir == 1) { for(i = 0; i < 3; i++) { if(bit(piece, 3 * i + 0)) tp += 1 << (3 * i + 2); if(bit(piece, 3 * i + 1)) tp += 1 << (3 * i + 11); if(bit(piece, 3 * i + 2)) tp += 1 << (3 * i + 20); if(bit(piece, 3 * i + 9)) tp += 1 << (3 * i + 1); if(bit(piece, 3 * i + 10)) tp += 1 << (3 * i + 10); if(bit(piece, 3 * i + 11)) tp += 1 << (3 * i + 19); if(bit(piece, 3 * i + 18)) tp += 1 << (3 * i + 0); if(bit(piece, 3 * i + 19)) tp += 1 << (3 * i + 9); if(bit(piece, 3 * i + 20)) tp += 1 << (3 * i + 18); } } else { for(i = 0; i < 3; i++) { if(bit(piece, i + 0)) tp += 1 << (i + 18); if(bit(piece, i + 3)) tp += 1 << (i + 9); if(bit(piece, i + 6)) tp += 1 << (i + 0); if(bit(piece, i + 9)) tp += 1 << (i + 21); if(bit(piece, i + 12)) tp += 1 << (i + 12); if(bit(piece, i + 15)) tp += 1 << (i + 3); if(bit(piece, i + 18)) tp += 1 << (i + 24); if(bit(piece, i + 21)) tp += 1 << (i + 15); if(bit(piece, i + 24)) tp += 1 << (i + 6); } } piece = tp; } void piecea(int piece) { int a1, a2, a3, p; npieces[0] = 0; for(a1 = -3; a1 < 3; a1++) { for(a2 = -3; a2 < 3; a2++) { for(a3 = -3; a3 < 3; a3++) { p = piece; if(translate(p, a1, a2, a3)) { pieces[0][npieces[0]++] = p; } } } } } void piecerest(int n, int piece) { int a1, a2, a3, i, p; int a4, a5, a6; npieces[n] = 0; for(a1 = -3; a1 < 3; a1++) { for(a2 = -3; a2 < 3; a2++) { for(a3 = -3; a3 < 3; a3++) { p = piece; if(!translate(p, a1, a2, a3)) continue; for(a4 = 0; a4 < 4; a4++) { rotate(p, 0); for(a5 = 0; a5 < 4; a5++) { rotate(p, 1); for(a6 = 0; a6 < 4; a6++) { rotate(p, 2); for(i = 0; i < npieces[n]; i++) if(pieces[n][i] == p) break; if(i >= npieces[n]) pieces[n][npieces[n]++] = p; } } } } } } } int encodestr(char *str) { int piece = 0; for(int i = 0; i < 27; i++) if(str[i] != ' ' && str[i] != '.') piece += 1 << i; return piece; } void putpiece(int n) { int i, j; if(n >= 7) { char str[30]; for(i = 0; i < 7; i++) { for(j = 0; j < 27; j++) { if(bit(pieces[i][picked[i]], j)) str[j] = 'a' + i; } } str[27] = '\0'; outs << str << endl; return; } for(i = 0; i < npieces[n]; i++) { if((pieces[n][i] & current) == 0) { current += pieces[n][i]; picked[n] = i; putpiece(n + 1); current -= pieces[n][i]; } } } int main() { char str[30]; piecerest(1, encodestr("bb.b.......................")); piecerest(2, encodestr("ccc.c......................")); piecerest(3, encodestr("dd..dd.....................")); piecerest(4, encodestr("ee.e.....e.................")); piecerest(5, encodestr("ff.f........f..............")); piecerest(6, encodestr("gg.g......g................")); while(ins >> str) { piecea(encodestr(str)); current = 0; putpiece(0); outs << endl; } return 0; } // @END_OF_SOURCE_CODE