1. 程式人生 > >洛谷 P1205 [USACO1.2]方塊轉換 Transformations

洛谷 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;
}