#include #include #define MAXPSIZE 4 #define MAXROT 8 #define MAXPLAN 12 #define MAXPIECES 5 using namespace std; struct fixed_piece_t { int size; bool a[MAXPSIZE][MAXPSIZE]; }; class free_piece_t { int size; bool a[MAXPSIZE][MAXPSIZE][MAXROT]; public: int positions; free_piece_t() { positions = 0; size = 0;} void read(ifstream&); void get_rotation(int, fixed_piece_t&); }; class state_t { public: int n, m; int b[MAXPLAN][MAXPLAN]; state_t() {n=m=0;} void read(ifstream&); void print(); void copy(state_t&); bool match(int, int, fixed_piece_t&); void commit(int, int, fixed_piece_t&, int); }; void free_piece_t::read(ifstream& in) { char c; in >> size; in >> positions; for (int p = 0; p < positions; p++) { for (int j = 0; j < size; j++) for (int i = 0; i < size; i++) { in >> c; a[i][j][p] = (c == '#'); } } } void free_piece_t::get_rotation(int p, fixed_piece_t& d) { d.size = size; for (int j = 0; j < size; j++) for (int i = 0; i < size; i++) d.a[i][j] = a[i][j][p]; } void state_t::read(ifstream& in) { char c; in >> n >> m; for (int j = 0; j < m; j++) for (int i = 0; i < n; i++) { in >> c; b[i][j] = (c == '.') ? 0 : -1; } } void state_t::copy(state_t& s) { n = s.n; m = s.m; for (int i=0; i=n || y+j>=m || b[x+i][y+j] != 0)) ok = false; return ok; } void state_t::commit(int x, int y, fixed_piece_t& p, int num){ for (int i=0; i> pieces_count; for (int i=0; i < pieces_count; i++) pieces[i].read(inpieces); state_t init; init.read(inboard); search(init, 0); cout << "Steps:\t"<