// Checker for problem A // Author: Grzegorz Herman #include #include #include #include #include using namespace std; #define check(cond,...) do { if (!(cond)) { fprintf(stderr, __VA_ARGS__); exit(1); } } while (0) int main(int argc, char * argv[]) { assert(argc == 4); FILE * fi = fopen(argv[1], "r"); FILE * fh = fopen(argv[2], "r"); FILE * fo = fopen(argv[3], "r"); int ncases; assert(1 == fscanf(fi, "%d", &ncases)); for (int kase = 1; kase <= ncases; ++kase) { int nrows, ncols; assert(2 == fscanf(fi, "%d%d", &ncols, &nrows)); vector> data(nrows, vector(ncols)); for (int r = 0; r < nrows; ++r) for (int c = 0; c < ncols; ++c) assert(1 == fscanf(fi, "%d", &data[r][c])); char anso[12], ansh[12]; check(1 == fscanf(fo, " %11s", anso), "Case %d: cannot read the answer\n", kase); assert(1 == fscanf(fh, " %11s", ansh)); check(!strcmp(anso, ansh), "Case %d: invalid answer '%s', expected '%s'\n", kase, anso, ansh); if (strcmp(anso, "POSSIBLE")) continue; assert(0 == fscanf(fh, "%*[^\n]\n")); int nmoves = 0; check(1 == fscanf(fo, "%d", &nmoves), "Case %d: cannot read the number of moves\n", kase); check(0 <= nmoves, "Case %d: negative number of moves (%d)\n", kase, nmoves); check(nmoves <= 10*nrows*ncols, "Case %d: number of moves (%d) exceeds allowed bound (%d)\n", kase, nmoves, 10*nrows*ncols); for (int move=1; move<=nmoves; ++move) { char d; int i; check(2 == fscanf(fo, " %c%d", &d, &i), "Case %d: cannot read move #%d\n", kase, move); if (d == 'R') { check(1 <= i && i <= nrows, "Case %d: move #%d flips invalid row %d\n", kase, move, i); for (int c = 0; c < ncols/2; ++c) swap(data[i-1][c], data[i-1][ncols-c-1]); } else if (d == 'C') { check(1 <= i && i <= ncols, "Case %d: move #%d flips invalid column %d\n", kase, move, i); for (int r = 0; r < nrows/2; ++r) swap(data[r][i-1], data[nrows-r-1][i-1]); } else check(false, "Case %d: move #%d invalid dimension specifier '%c'\n", kase, move, d); } for (int r = 0, n = 1; r < nrows; ++r) for (int c = 0; c < ncols; ++c, ++n) check(data[r][c] == n, "Case %d: not sorted (row %d, col %d, expected %d, found %d)\n", kase, r+1, c+1, n, data[r][c]); } return 0; }