USACO section1.2 Transformations


シミュレーション問題、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; }

/**/