USACO-Section1.2 Transformations [其他]

18 篇文章 0 订阅

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经过本站工作人员近一个月的辛苦劳动,在大家的积极配合下,黑白网络的第一期网上月刊《黑客攻防指南》终于和大家见面了,为了感谢本站的支持者们近三年来对本站的大力支持,本期月刊,免费赠阅。从名字中,大家就应该知道了,这是一本主要讲解黑客攻击与网络安全防范为主的电子杂志,希望您能通过我们的杂志真正的学些东西,再也不要整天四处询问如何偷人家的OICQ密码等幼稚的问题了,那些都是没有用的,就算你有成千上万个5位数的OICQ密码(这绝对是可以办到的,呵呵,怎么办?告诉你,要保密啊,想办法成为QQ公司数据管理员的小舅子啊,哈哈,那样什么密码你都能知道啦,呵呵,开个玩笑,你可别真问我,QQ数据管理员多大岁数啊),那又能代表什么呢?又对你有什么帮助呢?真正学会点网络安全的知识,才是最重要的。或许本期月刊上有些文章您可能在我们的网站上或是其他网站上看到过,但我敢肯定,还是有相当大的一部分人,没有看过,因为我们月刊刚刚建立,所以比较经典的教程,我们还是会放上来给大家看的,看过的,就当从温习一下以前的功课吧,但这种情况会随着我们月刊的发展,逐渐消失的,我们已经下大力气征稿了,提供了很多优惠的条件,向广大网友进行征稿,如果您的文笔不错,又是网络安全的业内人士的话,希望您积极向本站投稿,让大家一起欣赏您的佳作。具体征稿要求请查看征稿启示。如果您看完本刊,感觉错的话,请继续支持我们,订阅下期电子杂志,每期杂志定价为人民币10元,一次性订阅12期,仅需100元。《黑客攻防指南》每期100篇文章,和您交的订阅费一平均,您看一篇教程,仅需要1毛钱而已,因为是电子杂志,所以文章数量绝对要比普通杂志要多很多,花同样钱,您可以看到更多的文章,何乐而不为呢?而且我们有做网络安全站点(黑白网络,专门提供黑客教程浏览,工具下载的站点)多年的经验,并有专人每天花大量的时间在各个网络安全及黑客站点,各种论坛的安全版面收集整理黑客攻击与防范这方面的资料,从深到浅的文章都有,可以这么说,只要您会上网,就能在我们的月刊中,找到您能看懂的技术文章,呵呵,不过我们可不能保证,您看了我们的杂志,一定能成为网络安全专家或是黑客高手,这就好像呢到书店买书一样,书买到手了,关键看你自己怎么学了,要是你真想学,就一定能学好的。好了不多说废话了,您先看吧,我们真心希望这本电子杂志能使您由菜鸟成为大侠!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值