#include #include #include using namespace std; #define MAXR 500 #define MAXC 500 const int deltar[] = {0, -1, 0, 1}; const int deltac[] = {1, 0, -1, 0}; int r, c; char maze_in[MAXR][MAXC+10]; char maze_out[MAXR][MAXC+10]; bool valid_pos(int i, int j) { return 0 <= i && i < r && 0 <= j && j < c; } bool cmp() { /* maze_out is maze_in behalve dat er misschien een pad in zit. */ for (int i = 0; i < r; i++) { for (int j = 0; j < c; j++) { if (maze_in[i][j] == maze_out[i][j] || (maze_in[i][j] == '.' && maze_out[i][j] == 'O')) { continue; } else { return false; } } } return true; } int path(int i, int j) { int cnt = 0; while (valid_pos(i, j)) { int dir, o, inval; maze_out[i][j] = 'P'; dir = -1; o = 0; inval = 0; for (int k = 0; k < 4; k++) { int i2 = i + deltar[k]; int j2 = j + deltac[k]; if (valid_pos(i2, j2)) { if (maze_out[i2][j2] == 'O') { o++; dir = k; } } else { inval++; } } if (o == 1) { // Precies ????n O om te volgen i += deltar[dir]; j += deltac[dir]; cnt++; } else if (o == 0 && inval > 0) { // rand bereikt en geen Os om te volgen return cnt; } else { // er ging iets mis return -1; } } assert (false); } bool leftover() { for (int i = 0; i < r; i++) { for (int j = 0; j < c; j++) { if (maze_out[i][j] == 'O') { return true; } } } return false; } void input_in (istream &in) { in >> r >> c; for (int i = 0; i < r; i++) { in >> maze_in[i]; } } bool input_out (istream &f) { for (int i = 0; i < r; i++) { for (int j = 0; j < c; j++) { maze_out[i][j] = f.get(); } if (f.get() != '\n') { cerr << "verwachtte \\n." << endl; return false; } } if (f.get() != '\n') { cerr << "verwachtte \\n." << endl; return false; } return true; } int main (int argc, const char *argv[]) { ifstream fin, fout, fjury; int t; if (argc != 4) { cerr << "gebruik: " << argv[0] << " invoer.in uitvoer.out extra.jury" << endl; cerr << endl; cerr << "Het bestand hier aangegeven als extra.jury moet co??rdinaten " << "bevatten van Y en de lengte van het kortste pad." << endl; return 2; } fin.open(argv[1]); fout.open(argv[2]); fjury.open(argv[3]); if (fin.fail() || fout.fail() || fjury.fail()) { cerr << "Kon bestand niet openen." << endl; return 2; } fin >> t; for (int i = 0; i < t; i++) { int yi, yj, l, c; input_in (fin); fjury >> yi >> yj >> l; if (!input_out (fout)) { cerr << "Kon uitvoer niet lezen." << endl; return 1; } if (!cmp()) { cerr << "Doolhoven incompatibel." << endl; return 1; } c = path(yi, yj); if (c == -1) { cerr << "Kon pad niet volgen." << endl; return 1; } if (l != c) { cerr << "Lengte van pad incorrect (" << l << "!=" << c << ")." << endl; return 1; } if (leftover()) { cerr << "Er zijn Os die niet op het pad liggen." << endl; return 1; } cerr << "Doolhof " << i << " is okay!" << endl; } return 0; }