#include using namespace std; #define SIMULACOES 1000 #define MINSUCESSOS 800 #define SEED 132145 #define FAILPROB 0.25 #define mL 0 #define mR 1 #define mD 2 #define mU 3 typedef int Move; mt19937 rng(SEED); uniform_real_distribution<> dis(0.0, 1.0); char s[10010]; char grid[55][55]; FILE* readOrDie(const char* input_fn) { FILE* fin = fopen(input_fn, "r"); if (fin == NULL) { fprintf(stderr, "Falha ao abrir o ficheiro: %s\n", input_fn); abort(); } } int readInt(FILE* file) { int a; fscanf(file, "%d", &a); return a; } void readString(FILE* file, char* str) { fscanf(file, " %s", str); } int fail() { if (dis(rng) < FAILPROB) return 1; return 0; } Move flip(Move m) { switch(m) { case mL: return mR; case mR: return mL; case mD: return mU; default: return mD; } } Move move(Move m) { if (fail()) { m = flip(m); } return m; } Move charToMove(char ch) { switch(ch) { case 'L': return mL; case 'R': return mR; case 'D': return mD; default: return mU; } } int xapply(Move m) { switch(m) { case mL: return -1; case mR: return 1; case mD: return 0; default: return 0; } } int yapply(Move m) { switch(m) { case mL: return 0; case mR: return 0; case mD: return 1; default: return -1; } } int simulate(int n, char* str) { int slen = strlen(str); int reach = 0; int xpos = 1, ypos = 1; for (int i = 0; i < slen; i++) { Move m = move(charToMove(str[i])); int nxpos = xpos + xapply(m); int nypos = ypos + yapply(m); if (nxpos >= 1 && nxpos <= n && nypos >= 1 && nypos <= n && grid[nypos - 1][nxpos - 1] != '#') { xpos = nxpos; ypos = nypos; } if (xpos == n && ypos == n) { reach = 1; break; } } return reach; } int main(int argc, char** argv) { if (argc != 3) { fprintf(stderr, "Numero invalido de argumentos, chamar como: %s \n", argv[0]); exit(1); } const char* input_fn = argv[1]; const char* obtained_fn = argv[2]; FILE* inputF = readOrDie(input_fn); FILE* obtainedF = readOrDie(obtained_fn); int n = readInt(inputF); for (int i = 0; i < n; i++) readString(inputF, grid[i]); int slen; fscanf(obtainedF, "%d", &slen); fscanf(obtainedF, " %10005s", s); if (slen != strlen(s)) { printf("Incorreto, o numero de instrucoes dado nao corresponde ao lido (Mi=%d e foram lidas %d).\n", slen, int(strlen(s))); return 0; } if (strlen(s) > 200 * n) { printf("Incorreto, o numero das instrucoes (%d) e demasiado grande.\n", int(strlen(s))); return 0; } int succ = 0; for (int i = 0; i < SIMULACOES; i++) succ += simulate(n, s); printf("Numero de instrucoes: %d\n", int(strlen(s))); if (succ >= MINSUCESSOS) printf("Correto! Sucessos/Simulacoes %d/%d\n", succ, 1000); else printf("Incorreto... Sucessos/Simulacoes, %d/%d\n", succ, 1000); return 0; }