洛谷 P1205 [USACO1.2]方块转换 Transformations

Posted 一蓑烟雨任生平

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷 P1205 [USACO1.2]方块转换 Transformations相关的知识,希望对你有一定的参考价值。

题目描述

一块N x N(1<=N<=10)正方形的黑白瓦片的图案要被转换成新的正方形图案。写一个程序来找出将原始图案按照以下列转换方法转换成新图案的最小方式:

1:转90度:图案按顺时针转90度。

2:转180度:图案按顺时针转180度。

3:转270度:图案按顺时针转270度。

4:反射:图案在水平方向翻转(以中央铅垂线为中心形成原图案的镜像)。

5:组合:图案在水平方向翻转,然后再按照1到3之间的一种再次转换。

6:不改变:原图案不改变。

7:无效转换:无法用以上方法得到新图案。

如果有多种可用的转换方法,请选择序号最小的那个。

只使用1--7中的一个步骤来完成这次转换。

输入输出格式

输入格式:

 

第一行: 单独的一个整数N。

第二行到第N+1行: N行每行N个字符(不是“@”就是“-”);这是转换前的正方形。

第N+2行到第2*N+1行: N行每行N个字符(不是“@”就是“-”);这是转换后的正方形。

 

输出格式:

 

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

 

输入输出样例

输出样例#1: 复制
1

说明

题目翻译来自NOCOW。

USACO Training Section 1.2

思路:暴力模拟要注意去字典序最小的。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,TAT=0x7f7f7f7f;
char s[12];
int map[11][11],tmp[11][11],ans[11][11];
void rnad(){
    memset(tmp,0,sizeof(tmp));
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            tmp[j][n-i+1]=map[i][j];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            map[i][j]=tmp[i][j];
}
void guide(){
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n/2;j++)
            swap(map[i][j],map[i][n-j+1]);
}
bool judge(){
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            if(map[i][j]!=ans[i][j])    return false;
    return true;
}
void slove(){
    if(judge()){ TAT=min(TAT,6); }
    rnad();if(judge()){ TAT=min(1,TAT); }
    rnad();if(judge()){ TAT=min(2,TAT); }
    rnad();if(judge()){ TAT=min(3,TAT); }
    rnad();guide();
    if(judge()){ TAT=min(4,TAT); }
    rnad();if(judge()){ TAT=min(5,TAT); }
    rnad();if(judge()){ TAT=min(5,TAT); }
    rnad();if(judge()){ TAT=min(5,TAT); }
    TAT=min(TAT,7);
    cout<<TAT;
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%s",s);
        for(int j=0;j<n;j++)
            if(s[j]==@)    map[i][j+1]=1;
    }
    for(int i=1;i<=n;i++){
        scanf("%s",s);
        for(int j=0;j<n;j++)
            if(s[j]==@)    ans[i][j+1]=1;
    }
    slove();
}

 

 

 

以上是关于洛谷 P1205 [USACO1.2]方块转换 Transformations的主要内容,如果未能解决你的问题,请参考以下文章

P1205 [USACO1.2]方块转换 Transformations

luogu P1205 方块转换

USACO1.2_2★Transformations 方块转换

洛谷P1204 [USACO1.2]挤牛奶Milking Cows

洛谷P1206 [USACO1.2]回文平方数 Palindromic Squares

洛谷P1207 [USACO1.2]双重回文数 Dual Palindromes