码迷,mamicode.com
首页 > 其他好文 > 详细

USACO--1.2Transformations

时间:2015-03-07 17:16:52      阅读:125      评论:0      收藏:0      [点我收藏+]

标签:usaco

题意很容易理解,思路也是简单的,基本上就是直接模拟。但一开始我怎么也推不出原地旋转的坐标变换表达式(空间想象力不够。。。。。),导致卡了很久。
对于一个n*n的矩形(下标从1开始),其中一点(x,y)原地旋转90°后的坐标:(y,n-x+1);原地旋转180°后的坐标:(n-x+1,n-y+1);原地旋转270°后的坐标:(n-y+1,x).得到这个公式后代码就好写了,当然我们其实只需要写一个旋转90°的函数就行了,因为180°就是旋转2次90°吗,270度就是旋转3次90°吗。

代码如下:

/*
ID: 15674811
LANG: C++
TASK: transform
*/

#include<iostream>
#include<cstring>
#include<cstdio>
#include<fstream>
using namespace std;

//ifstream fin("lkl.txt");
ofstream fout("transform.out");
ifstream fin("transform.in");
int n;
char m[12][12],goal[12][12];

int check()
{
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
           if(m[i][j]!=goal[i][j])
              return 0;
    return 1;
}

void Rt_90()
{
    char tmp[12][12];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            tmp[j][n-i+1]=m[i][j];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            m[i][j]=tmp[i][j];
}

///水平反射,其实就是关于中轴线对称
void Rf()
{
    int k=n/2;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=k;j++)
        {
            int t=m[i][j];
            m[i][j]=m[i][n-j+1];
            m[i][n-j+1]=t;
        }
}

void solve()
{
    int flag=0;
    if(check())
        flag=1;
    for(int i=1;i<=3;i++)
    {
        Rt_90();
        if(check())
        {
            fout<<i<<endl;
            return;
        }
    }
    Rt_90();///再次旋转90度使得矩形复原
    Rf();
    if(check())
    {
        fout<<"4"<<endl;
        return;
    }
    for(int i=1;i<=3;i++)
    {
        Rt_90();
        if(check())
        {
            fout<<"5"<<endl;
            return;
        }
    }
    if(flag)
    {
        fout<<"6"<<endl;
        return ;
    }
    fout<<"7"<<endl;
}

int main()
{
    while(fin>>n)
    {
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                fin>>m[i][j];
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                fin>>goal[i][j];
        solve();
    }
  return 0;
}

USACO--1.2Transformations

标签:usaco

原文地址:http://blog.csdn.net/acm_lkl/article/details/44117153

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!