USACO Section 1.2.2 Transformations

矩阵转换,简单题目,每一次比较没有必要真正的转换方阵,而是只要比较转换后的每个元素的位置,对应到原图的位置,并与目标方阵的标准位置比较就好,说的很绕口,也

很难说清楚,看代码吧

还要注意一点 能用1转换的,就不能用其他的,优先级不一样


/*
ID: zhuihun1
PROG: transform
LANG: C++
*/
#include <iostream>
#include <fstream>
#include <string.h>
#include <stdio.h>
#include<algorithm>
#define MAXSIZE 20
using namespace std;

char aim_map[MAXSIZE][MAXSIZE];
int n;
bool  clockwise(char map[MAXSIZE][MAXSIZE],int du)
{
    int i,j,g,h;
    switch(du)
    {
        case 270:
        for(j=0,g=0;i<n&&g<n;j++,g++)
            for(i=n-1,h=0;i>-1&&h<n;i--,h++)
                if(aim_map[i][j]!=map[g][h])
                    return false;
        break;
        case 180:
        for(i=n-1,g=0;i>-1&&g<n;i--,g++)
            for(j=n-1,h=0;j>-1&&h<n;j--,h++)
                if(aim_map[i][j]!=map[g][h])
                    return false;
        break;
        case 90:
        for(j=n-1,g=0;j>-1&&g<n;j--,g++)
            for(i=0,h=0;i<n&&h<n;i++,h++)
                if(aim_map[i][j]!=map[g][h])
                    return false;
        break;
        case -1:
        for(i=0,g=0;i<n&&g<n;i++,g++)
            for(j=n-1,h=0;j>-1&&h<n;j--,h++)
                if(aim_map[i][j]!=map[g][h])
                    return false;
        break;
    }
    return true;
}
bool comp(char map[MAXSIZE][MAXSIZE])
{
     for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
            if(aim_map[i][j]!=map[i][j])
                return false;
    return true;
}
int main()
{
    char map[MAXSIZE][MAXSIZE];
    ofstream fout ("transform.out");
    ifstream fin ("transform.in");
    int i,j,g,h,num=7;
    fin>>n;
    for(i=0;i<n;i++)
        for(j=0;j<n;j++)
            fin>>map[i][j];
    for(i=0;i<n;i++)
        for(j=0;j<n;j++)
            fin>>aim_map[i][j];

    if(clockwise(map,90))
        num=1;
    else if(clockwise(map,180))
        num=2;
    else if(clockwise(map,270))
        num=3;
    else if(clockwise(map,-1))
        num=4;
    else if(comp(map))
        num=6;
    else
    {
        char tmp_map[MAXSIZE][MAXSIZE];
        for(i=0,g=0;i<n&&g<n;i++,g++)
            for(j=n-1,h=0;j>-1&&h<n;j--,h++)
                tmp_map[i][j]=map[g][h];
        if(clockwise(tmp_map,90))
            num=5;
        else if(clockwise(tmp_map,180))
            num=5;
        else if(clockwise(tmp_map,270))
            num=5;
    }
    fout<<num<<endl;
    return 0;
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值