USACO Section 1.2 - Transformations

题意

给一个图,问经过哪一步骤可以得到结果图

思路

感觉做这些题目一点快感都没有( TДT)

模拟,实际上只需要两个函数就行,一个是旋转90°的函数,另一个是对称的函数。

用image数组保存当前的状态,转一下判断一下。所以1~3步骤可以合并。之后也挺简单的,不多说了

代码

/*
ID: mycodeb1
LANG: C++
TASK: transform
*/
 
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 10 + 2;
 
int n;
char mp[MAXN][MAXN], res[MAXN][MAXN], image[MAXN][MAXN];
 
void reNew()
{
    for (int i = 0; i < n; i++)
        strcpy(image[i], mp[i]);
}
 
bool Check()
{
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            if (res[i][j] != image[i][j])
                return false;
    return true;
}
 
void Rotate()
{
    char temp[MAXN][MAXN];
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            temp[j][n - 1 - i] = image[i][j];
    for (int i = 0; i < n; i++)
        strcpy(image[i], temp[i]);
}
 
void Reflection()
{
    char temp[MAXN][MAXN];
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            temp[i][n - 1 - j] = image[i][j];
    for (int i = 0; i < n; i++)
        strcpy(image[i], temp[i]);
}
 
int main()
{
    //freopen("input.txt", "r", stdin);
    freopen("transform.in", "r", stdin);
    freopen("transform.out", "w", stdout);
    ios::sync_with_stdio(false);
 
    int i, j;
    scanf("%d%*c", &n);
    for (i = 0; i < n; i++)
        gets(mp[i]);
    for (i = 0; i < n; i++)
        gets(res[i]);
    reNew();
    for (i = 1; i <= 3; i++)
    {
        Rotate();
        if (Check())
        {
            printf("%d\n", i);
            return 0;
        }
    }
    reNew();
    Reflection();
    if (Check())
    {
        printf("4\n");
        return 0;
    }
    for (i = 0; i < 3; i++)
    {
        Rotate();
        if (Check())
        {
            printf("5\n");
            return 0;
        }
    }
    reNew();
    if (Check())
    {
        printf("6\n");
        return 0;
    }
    printf("7\n");
    return 0;
}

Powered by Jekyll and Theme by solid