USACO-Section1.2 Transformations [其他]

2017-6-1

题目大意

一块N x N(1<=N<=10)正方形的黑白瓦片的图案要被转换成新的正方形图案。写一个程序来找出将原始图案按照以下列转换方法转换成新图案的最小方式:
1:转90度:图案按顺时针转90度。
2:转180度:图案按顺时针转180度。
3:转270度:图案按顺时针转270度。
4:反射:图案在水平方向翻转(以中央铅垂线为中心形成原图案的镜像)。
5:组合:图案在水平方向翻转,然后再按照1到3之间的一种再次转换。
6:不改变:原图案不改变。
7:无效转换:无法用以上方法得到新图案。
如果有多种可用的转换方法,请选择序号最小的那个。
只使用1~7中的一个步骤来完成这次转换。
(copy from nocow)

题解

实现上面提到的几种变换,依次尝试即可。

代码

/*
ID: zachery1
PROG: transform
LANG: C++
*/
#include <iostream>
#include <fstream>
#define MAXN 20
#define cin fin
#define cout fout
using namespace std;
ifstream fin("transform.in");
ofstream fout("transform.out");

char a[MAXN][MAXN], b[MAXN][MAXN], c[MAXN][MAXN];
char tmp[MAXN][MAXN];
int N;

inline bool isSame() {
    for (int i = 0; i < N; i++)
        for (int j = 0; j < N; j++)
            if (tmp[i][j] != b[i][j])
                return false;
    return true;
}

bool fun1(char a[][MAXN]) {
    for (int i = 0; i < N; i++)
        for (int j = 0; j < N; j++)
            tmp[j][N-1-i] = a[i][j];
    return isSame();
}

bool fun2(char a[][MAXN]) {
    for (int i = 0; i < N; i++) 
        for (int j = 0; j < N; j++)
            tmp[N-1-i][N-1-j] = a[i][j];
    return isSame();
}

bool fun3(char a[][MAXN]) {
    for (int i = 0; i < N; i++)
        for (int j = 0; j < N; j++)
            tmp[N-1-j][i] = a[i][j];
    return isSame();
}

bool fun4(char a[][MAXN], char tmp[][MAXN]) {
    for (int i = 0; i < N; i++)
        for (int j = 0; j < N; j++)
            tmp[i][N-1-j] = a[i][j];
    return isSame();
}

bool fun5() {
    fun4(a, c);
    if (fun1(c) || fun2(c) || fun3(c))
        return true;
    else 
        return false;
}

bool fun6() {
    for (int i = 0; i < N; i++)
        for (int j = 0; j < N; j++)
            tmp[i][j] = a[i][j];
    return isSame();
}


void solve() {
    int ans;
    if (fun1(a)) ans = 1;
    else if (fun2(a)) ans = 2;
    else if (fun3(a)) ans = 3;
    else if (fun4(a, tmp)) ans = 4;
    else if (fun5()) ans = 5;
    else if (fun6()) ans = 6;
    else ans = 7;

    cout << ans << endl;
}
int main() {
    ios::sync_with_stdio(false);
    cin >> N;
    for (int i = 0; i < N; i++) 
        for (int j = 0; j < N; j++)
            cin >> a[i][j];
    for (int i = 0; i < N; i++)
        for (int j = 0; j < N; j++)
            cin >> b[i][j];
    solve ();
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值