现在的位置: 首页 > 综合 > 正文

USACO Transformations

2013年04月29日 ⁄ 综合 ⁄ 共 1728字 ⁄ 字号 评论关闭

~~~题目链接~~~

题目大意:

一块N x N(1<=N<=10)正方形的黑白瓦片的图案要被转换成新的正方形图案。写一个程序来找出将原始
图案按照以下列转换方法转换成新图案的最小方式:
#1:转90度:图案按顺时针转90度。
#2:转180度:图案按顺时针转180度。
#3:转270度:图案按顺时针转270度。
#4:反射:图案在水平方向翻转(形成原图案的镜像)。
#5:组合:图案在水平方向翻转,然后按照#1-#3之一转换。
#6:不改变:原图案不改变。
#7:无效转换:无法用以上方法得到新图案。
如果有多种可用的转换方法,请选择序号最小的那个。

PROGRAM NAME: transform
INPUT FORMAT
第一行: 单独的一个整数N。 
第二行到第N+1行: N行每行N个字符(不是“@”就是“-”);这是转换前的正方形。 
第N+2行到第2*N+1行: N行每行N个字符(不是“@”就是“-”);这是转换后的正方形。 

SAMPLE INPUT (file transform.in)
3
@-@
---
@@-
@-@
@--
--@

OUTPUT FORMAT

单独的一行包括1到7之间的一个数字(在上文已描述)表明需要将转换前的正方形变为转换后的正方形的
转换方法。

SAMPLE OUTPUT (file transform.out)

1

思路:只需要知道向左旋和反转的坐标的变化即可;

左旋:列坐标变为横坐标, 列坐标用n+1减去横坐标(横坐标起始为1)

反转:横坐标不变, 列坐标变为n+1减去当前列坐标(列坐标起始位1)

然后就是函数的调用

code:

#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
int n = 0;
char map1[12][12], map2[12][12], map3[12][12], map4[12][12];

void rotate(char map[12][12])
{
    int i = 0, j = 0;
    for(i = 1; i<=n; i++)
        for(j = 1; j<=n; j++)
            map2[j][n+1-i] = map[i][j];
}

void mirror(char map[12][12])
{
    int i = 0, j = 0;
    for(i = 1; i<=n; i++)
    {
        for(j = n; j>0; j--)
        {
            map3[i][n-j+1] = map[i][j];
        }
    }
}


int equal(char map2[12][12])
{
    int i = 0, j = 0;
    for(i = 1; i<=n; i++)
        for(j = 1; j<=n; j++)
            if(map1[i][j] != map2[i][j]) return 0;
    return 1;
}

int solve(char map[][12])//把形参map1旋转
{
    int i = 0, j = 0;
    rotate(map);
    if(equal(map2)) return  1;
    else
    {
        for(i = 1; i<=n; i++)
            for(j = 1; j<=n; j++)
                map3[i][j] = map2[i][j];
        rotate(map3);
        if(equal(map2)) return  2;
        else
        {
            for(i = 1; i<=n; i++)
            for(j = 1; j<=n; j++)
                map3[i][j] = map2[i][j];
            rotate(map2);
            if(equal(map2)) return 3;
        }
    }
    return 0;
}



int main()
{
    freopen("transform.in", "r", stdin);
    freopen("transform.out", "w", stdout);
    int i = 0, j = 0, ans = 0;
    cin>>n;
    for(i = 1; i<=n; i++)
        for(j = 1; j<=n; j++)
            cin>>map4[i][j];
    for(i = 1; i<=n; i++)
        for(j = 1; j<=n; j++)
            cin>>map1[i][j];
    if(ans = solve(map4));
    else
    {
        mirror(map4);
        if(equal(map3)) ans = 4;
        else if(solve(map3)) ans = 5;
        else if(equal(map4)) ans = 6;
        else ans = 7;
    }
    cout<<ans<<endl;
    return 0;
}

抱歉!评论已关闭.