洛谷 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:
1

说明
题目翻译来自NOCOW。
USACO Training Section 1.2
.
.
.
.
.
.
分析
一道模拟题
这里调换了2和3,是因为不存在顺时针转90度不可行,而顺时针转180度和逆时针转90度同时可行的情况。
.
.
.
.
.
.
程序:

#include<iostream>
using namespace std;
int n,flag,f,g,h,x,y,p,z;
char a[100][100],b[100][100],c[100][100],d[100][100],e[100][100],w[100][100],r[100][100],t[100][100];
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            cin>>a[i][j];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            cin>>d[i][j];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            b[i][j]=a[j][i];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            c[i][j]=b[i][n+1-j];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            if(c[i][j]!=d[i][j])
            {
                flag=1;
                break;
            }
    if(flag==0)
    {
        cout<<1;
        return 0;
    }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            e[i][j]=a[j][i];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            w[i][j]=e[n+1-i][j];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            if(w[i][j]!=d[i][j])
            {
                f=1;
                break;
            }
    if(f==0&&flag==1)
    {
        cout<<3;
        return 0;
    }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            r[i][j]=a[n+1-i][j];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            t[i][j]=r[i][n+1-j];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            if(t[i][j]!=d[i][j])
            {
                g=1;
                break;
            }
    if(g==0&&f==1&&flag==1)
    {
        cout<<2;
        return 0;
    }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            t[i][j]=a[i][n+1-j];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            if(t[i][j]!=d[i][j])
            {
                x=1;
                break;
            }
    if(x==0&&g==1&&f==1&&flag==1)
    {
        cout<<4;
        return 0;
    }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            t[i][j]=a[i][n+1-j];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            b[i][j]=t[j][i];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            c[i][j]=b[i][n+1-j];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            if(c[i][j]!=d[i][j])
            {
                y=1;
                break;
            }
    if(y==0&&x==1&&g==1&&f==1&&flag==1)
    {
        cout<<5;
        return 0;
    }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            t[i][j]=a[i][n+1-j];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            b[i][j]=t[n+1-i][j];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            c[i][j]=b[i][n+1-j];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            if(c[i][j]!=d[i][j])
            {
                z=1;
                break;
            }
    if(z==0&&y==1&&x==1&&g==1&&f==1&&flag==1)
    {
        cout<<5;
        return 0;
    }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            t[i][j]=a[i][n+1-j];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            b[i][j]=t[n+1-i][j];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            c[i][j]=b[i][n+1-j];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            if(c[i][j]!=d[i][j])
            {
                p=1;
                break;
            }
    if(p==0&&z==1&&y==1&&x==1&&g==1&&f==1&&flag==1)
    {
        cout<<5;
        return 0;
    }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            if(a[i][j]!=d[i][j])
            {
                h=1;
                break;
            }
    if(h==0&&x==1&&y==1&&z==1&&p==1&&g==1&&f==1&&flag==1)
    {
        cout<<6;
        return 0;
    }
    if(h==1&&x==1&&y==1&&z==1&&p==1&&g==1&&f==1&&flag==1)
        cout<<7;
    return 0;
}
原文地址:https://www.cnblogs.com/YYC-0304/p/10292831.html