果然是個complete search,
也只能直接做。
/* ID: mythnc2 LANG: C TASK: transform 2011/11/04 22:41:28 Transformations */ #include <stdio.h> #define MAXN 10 #define TRUE 1 #define FALSE 0 int menu(char (*)[], char (*)[], int); int de90(char (*)[], char (*)[], int); int de180(char (*)[], char (*)[], int); int de270(char (*)[], char (*)[], int); void reflect(char (*)[], char (*)[], int); int equal(char (*)[], char (*)[], int); int main (void) { FILE *fin, *fout; int n, i; char sq[MAXN][MAXN + 1], trans[MAXN][MAXN + 1]; fin = fopen("transform.in", "r"); fout = fopen("transform.out", "w"); fscanf(fin, "%d", &n); for (i = 0; i < n; i++) fscanf(fin, "%s", sq[i]); for (i = 0; i < n; i++) fscanf(fin, "%s", trans[i]); fprintf(fout, "%d\n", menu(sq, trans, n)); return 0; } /* menu: return one of the possible transformation */ int menu(char (*sq)[MAXN + 1], char (*trans)[MAXN + 1], int n) { char mirror[MAXN][MAXN + 1]; if (de90(sq, trans, n)) return 1; if (de180(sq, trans, n)) return 2; if (de270(sq, trans, n)) return 3; reflect(sq, mirror, n); if (equal(mirror, trans, n)) return 4; if (de90(mirror, trans, n) || de180(mirror, trans, n) || de270(mirror, trans, n)) return 5; if (equal(sq, trans, n)) return 6; return 7; } /* de90: if sq rotate 90 degree is trans return True */ int de90(char (*sq)[MAXN + 1], char (*trans)[MAXN + 1], int n) { int i, j; for (i = 0; i < n; i++) for (j = 0; j < n; j++) if (sq[i][j] != trans[j][n - 1 - i]) return FALSE; return TRUE; } /* de180: if sq rotate 180 degree is trans return True */ int de180(char (*sq)[MAXN + 1], char (*trans)[MAXN + 1], int n) { int i, j; for (i = 0; i < n; i++) for (j = 0; j < n; j++) if (sq[i][j] != trans[n - 1 - i][n - 1 - j]) return FALSE; return TRUE; } /* de270: if sq rotate 270 degree is trans return True */ int de270(char (*sq)[MAXN + 1], char (*trans)[MAXN + 1], int n) { int i, j; for (i = 0; i < n; i++) for (j = 0; j < n; j++) if (sq[i][j] != trans[n - 1 - j][i]) return FALSE; return TRUE; } /* reflect: copy the reflection of sq to mirror */ void reflect(char (*sq)[MAXN + 1], char (*mirror)[MAXN + 1], int n) { int i, j; for (i = 0; i < n; i++) for (j = 0; j < n; j++) mirror[i][n - 1 - j] = sq[i][j]; } /* equal: if sq is same as trans return True */ int equal(char (*sq)[MAXN + 1], char (*trans)[MAXN + 1], int n) { int i, j; for (i = 0; i < n; i++) for (j = 0; j < n; j++) if (sq[i][j] != trans[i][j]) return FALSE; return TRUE; }
沒有留言:
張貼留言