92 lines
1.6 KiB
C++
92 lines
1.6 KiB
C++
#pragma once
|
|
#include <bitset>
|
|
|
|
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<N> 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);
|
|
}
|
|
} |