#pragma once #include const int N = 20; enum { POI_PERSON, POI_BOX, POI_TARGET, POI_EXCEED, }; enum { SQR_WALL = 0, SQR_SPACE = 1, SQR_EXCEED = 2, }; struct Maze { std::bitset M[N]; int poi[3][2]; int at(int x, int y) const { return M[x][y]; } void set(int x, int y, int v) { M[x][y] = v; } void flip(int x, int y) { M[x].flip(y); } bool isValid() const { for (int i = 0; i < POI_EXCEED; ++i) { for (int j : {0, 1}) { if (poi[i][j] < 0 || poi[i][j] >= N) return false; } if (at(poi[i][0], poi[i][1]) == 0) return false; } return true; } }; inline Maze loadMaze(std::FILE *f) { char *s = new char[N + 5]; Maze res; for (int i = 0; i < N; ++i) { std::fscanf(f, "%s", s); for (int j = 0; j < N; ++j) { res.set(i, j, s[j] != '#'); switch (s[j]) { case 'P': res.poi[POI_PERSON][0] = i; res.poi[POI_PERSON][1] = j; break; case '*': res.poi[POI_BOX][0] = i; res.poi[POI_BOX][1] = j; break; case 'O': res.poi[POI_TARGET][0] = i; res.poi[POI_TARGET][1] = j; break; } } } delete[] s; return res; } inline void writeMaze(const Maze &m, std::FILE *f) { for (int i = 0; i < N; ++i) { for (int j = 0; j < N; ++j) { if (i == m.poi[POI_PERSON][0] && j == m.poi[POI_PERSON][1]) std::fputc('P', f); else if (i == m.poi[POI_BOX][0] && j == m.poi[POI_BOX][1]) std::fputc('*', f); else if (i == m.poi[POI_TARGET][0] && j == m.poi[POI_TARGET][1]) std::fputc('O', f); else if (m.at(i, j) == 0) std::fputc('#', f); else std::fputc('.', f); } std::fputc('\n', f); } }