Transformations

idea:

1.顺时针90度旋转到处理:b[i][j] = a[n-j][i];
2.180度、270度分别看成2次、3次90度旋转;
3.水平翻转到处理:看成列变换,b[i][j] = a[i][n-j];
4.分别做1-7处理,找出符合的代码输出。


实现代码:

/*
ID: mrster.1 
LANG: C++
TASK: transform
* */
#include<iostream>
#include<string>
#include<fstream>

using namespace std;

string* rotateBase(string* pattern,int n,int rotateType);
string* rotate(string* pattern,int n,int rotateNum);
bool compareStr(string* str1,string* str2,int n);

int main()
{
    //1--rotate by 90   2--rotate by horizon
    ifstream fin;
    ofstream fout;
    string tem;
    fin.open("transform.in");
    fout.open("transform.out");
    int n = 3;
    fin>>n;
    string* pattern = new string[n];
    string* compare = new string[n];
    getline(fin,tem);
    for(int i = 0;i < n;i++)
    {
        getline(fin,pattern[i]);
    }
    for(int i = 0;i < n;i++)
    {
        getline(fin,compare[i]);
    }
    int returnNum = 0;

    string* result = new string[n]; 
    for(int i = 1;i < 9;i++)
    {
        result = rotate(pattern,n,i);  
        if(compareStr(result,compare,n) == true)
        {
            returnNum = i;
            break;
        }
    }
    switch(returnNum)
    {
        case 1:fout<<1<<endl;break;
        case 2:fout<<2<<endl;break;
        case 3:fout<<3<<endl;break;
        case 4:fout<<4<<endl;break;
        case 5:case 6:case 7:fout<<5<<endl;break;
        case 8:fout<<6<<endl;break;
        default:fout<<7<<endl;
    }
    fin.close();
    fout.close();
}

bool compareStr(string* str1,string* str2,int n)
{
    for(int i = 0;i < n;i++)
    {
        if(str1[i] !=str2[i])return false;
    }
    return true;
}

string* rotate(string* pattern,int n,int rotateNum)
{
    string* result = new string[n];
    for(int i = 0;i < n;i++)
    {
        result[i].resize(n);
    }
    if(rotateNum == 1)
    {
        result = rotateBase(pattern,n,1);
    }
    else if(rotateNum == 2)
    {
        result = rotateBase(pattern,n,1);
        result = rotateBase(result,n,1);
    }
    else if(rotateNum == 3)
    {
        result = rotateBase(pattern,n,1);
        result = rotateBase(result,n,1);
        result = rotateBase(result,n,1);
    }
    else if(rotateNum == 4)
    {
        result = rotateBase(pattern,n,2);
    }
    else if(rotateNum == 5)
    {
        result = rotateBase(pattern,n,2);
        result = rotateBase(result,n,1);
    }
    else if(rotateNum == 6)
    {
        result = rotateBase(pattern,n,2);
        result = rotateBase(result,n,1);
        result = rotateBase(result,n,1);
    }
    else if(rotateNum == 7)
    {
        result = rotateBase(pattern,n,2);
        result = rotateBase(result,n,1);
        result = rotateBase(result,n,1);
        result = rotateBase(result,n,1);
    }
    else if(rotateNum == 8)
    {
        result = pattern;
    }
    return result;
}

string* rotateBase(string* pattern,int n,int rotateType)
{
    string* result = new string[n];
    for(int i = 0;i < n;i++)
    {
        result[i].resize(n);
    }
    for(int i = 0;i < n;i++)
    {
        for(int j = 0;j < n;j++)
        {
            if(rotateType == 1)
            {
                result[i][j] = pattern[n-j-1][i];
            }
            else if(rotateType == 2)
            {
                result[i][j] = pattern[i][n-j-1];
            }
        }
    }
    return result;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值