USACO-Section1.3 Transformations (矩阵旋转匹配问题)

2017-5-26

题目描述

给你两个n*n的字符矩阵,给你几种变换方式,输出从第一种状态到第二种状态
的最小操作序号

解答

我的方法就是直接从1到7挨个判断,满足题意就输出,直接结束,否则继续
代码比较长

代码

/*
ID: 18795871
PROG: transform
LANG: C++
*/ 
#include<iostream>
#include<fstream>
#include<cstring> 
using namespace std;

ifstream fin("transform.in");
ofstream fout("transform.out");

const int N = 10;
char x[N+1][N+1],y[N+1][N+1],z[N+1][N+1],w[N+1][N+1];
int n;

void Trans1(char p[N+1][N+1],char q[N+1][N+1]){
    for (int i=0;i<n;i++){
        for (int j=0;j<n;j++){
            p[j][n-i-1]=q[i][j];
        }
    }
}

void Trans2(char p[N+1][N+1],char q[N+1][N+1]){
    for (int i=0;i<n;i++){
        for (int j=0;j<n;j++){
            p[n-i-1][n-j-1]=q[i][j];
        }
    }
}

void Trans3(char p[N+1][N+1],char q[N+1][N+1]){
    for (int i=0;i<n;i++){
        for (int j=0;j<n;j++){
            p[n-j-1][i]=q[i][j];
        }
    }
}

void Trans4(char p[N+1][N+1],char q[N+1][N+1]){
    for (int i=0;i<n;i++){
        for (int j=0;j<n;j++){
            p[i][n-j-1]=q[i][j];
        }
    }
}

void Trans5(char p[N+1][N+1],char q[N+1][N+1],int num){
    switch(num){
        case 1:
            Trans1(p,q);
            break;
        case 2:
            Trans2(p,q);
            break;
        case 3:
            Trans3(p,q);
    }
}

bool isOK(char p[N+1][N+1],char q[N+1][N+1]){
    for (int i=0;i<n;i++){
        for (int j=0;j<n;j++){
            if (p[i][j]!=q[i][j]) return false;
        }
    }
    return true;
}

int main(){
    int i,j;
    while (fin>>n){
        for (i=0;i<n;i++){
            for (j=0;j<n;j++){
                fin>>x[i][j];
            }
        }
        for (i=0;i<n;i++){
            for (j=0;j<n;j++){
                fin>>y[i][j];
            }
        }
        Trans1(z,x);
        if (isOK(z,y)){
            fout<<1<<endl;
            continue;
        }
        Trans2(z,x);
        if (isOK(z,y)){
            fout<<2<<endl;
            continue;
        }
        Trans3(z,x);
        if (isOK(z,y)){
            fout<<3<<endl;
            continue;
        }
        Trans4(z,x);
        if (isOK(z,y)){
            fout<<4<<endl;
            continue;
        }
        bool f=false;
        Trans4(z,x);
        for (i=1;i<=3;i++){
            Trans5(w,z,i);
            if (isOK(w,y)){
                fout<<5<<endl;
                f=true;
                break;
            }   
        }
        if (isOK(x,y)){
            fout<<6<<endl;
            continue;
        }
        if (!f) fout<<7<<endl;
    }
    return 0;
}

个人感觉需要注意的地方:
(1)注意旋转之前和旋转之后的位置关系,得到正确的转换方式
(2)将函数封装起来,有助于第五个的判断
(3)我们不应该先判断6,如:

@@@
---
@@@
与
@@@
---
@@@

这两个其实是一样的,但是我们要输出2,因为它得先判断是否能够经过180度旋转得到。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值