USACO section1.2 Transformations
9093 ワード
シミュレーション問題、1つのnを与えます×nの文字ブロックの2つの状態(それぞれ初期状態と目標状態)といくつかの操作は,目標状態が少なくとも初期状態のどの操作で完了したのかを尋ね,WA 3回であった.
/**/
/*
PROG: transform
LANG: C++
*/
# include <cstdio>
# include <cstring>
# define N 10 + 5
void print(char s[][N], int n)
{
for (int i = 0; i < n; ++i)
puts(s[i]);
}
/* rotate 90 degrees clockwise */
void rotate(char s[][N], int n)
{
char buf[N][N];
memset(buf, 0, sizeof(buf));
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
buf[i][j] = s[n-j-1][i];
memcpy(s, buf, sizeof(buf));
//print(s, n);
}
void mirror(char s[][N], int n)
{
char buf[N][N];
memset(buf, 0, sizeof(buf));
for (int i = 0; i < n; /*puts(buf[i]), */++i)
for (int j = 0; j < n; ++j)
{
buf[i][j] = s[i][n-1-j];
}
memcpy(s, buf, sizeof(buf));
// print(s, n);
}
char isEqual(char s[][N], char g[][N], int n)
{
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
if (s[i][j] != g[i][j]) return 0;
return 1;
}
int main()
{
freopen("transform.in", "r", stdin);
freopen("transform.out", "w", stdout);
int n;
char s[N][N], f[N][N], g[N][N];
scanf("%d", &n);
for(int i = 0; i < n; ++i)
scanf("%s", s[i]);
for(int i = 0; i < n; ++i)
scanf("%s", g[i]);
memcpy(f, s, sizeof(s));
if (rotate(f, n), isEqual(f, g, n)) printf("1
");
else if (rotate(f, n), isEqual(f, g, n)) printf("2
");
else if (rotate(f, n), isEqual(f, g, n)) printf("3
");
else if (rotate(f, n), isEqual(s, g, n)) printf("6
");
else if (mirror(f, n), isEqual(f, g, n)) printf("4
");
else if (rotate(f, n), isEqual(f, g, n)) printf("5
");
else if (rotate(f, n), isEqual(f, g, n)) printf("5
");
else if (rotate(f, n), isEqual(f, g, n)) printf("5
");
else printf("7
");
fclose(stdin);
fclose(stdout);
return 0;
}
/**/