题解:P1205 [USACO1.2] 方块转换 Transformations

· · 题解

模拟……搜索……

1.题意简述:

核心转换方式

90°:图案按顺时针转 90°。

180°:图案按顺时针转 180°。

270°:图案按顺时针转 270°。

其它转换方式

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

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

注:剩下两种为并无实际作用的干扰项,不影响模拟。

2.思路:

本题的核心思路就是对每种操作进行暴力模拟,不过也非完全暴力,我们可以将每种操作写成函数,然后在主函数中按序号递增的顺序进行枚举,依次判断是否能转换成新图案,这样代码就很容易写了。

3.注意事项:

(1)请注意函数的顺序,不要在函数中使用未定义内容。

(2)请注意模拟时 +1-1边界问题

(3)注意依次判断时的顺序。

4.代码:

#include<bits/stdc++.h>
using namespace std;
int n;
char g[15][15],t1[15][15],t2[15][15],f[15][15];
void init(){                     //输入函数。
    cin>>n;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            cin>>g[i][j];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            cin>>f[i][j]; 
}
void reset(){
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            t1[i][j]=g[i][j];
}
void t90(){
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            t2[j][n-i+1]=t1[i][j];
}
void tfs(){
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            t2[i][n-j+1]=t1[i][j];
}
void strcpy(){
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            t1[i][j]=t2[i][j]; 
}
bool cmp(char a[15][15],char b[15][15]){   //判断是否能转换成新图案。
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            if(a[i][j]!=b[i][j])
                return 0;
    return 1;
}
int main(){
    init();
    reset();
    for(int i=1;i<=3;i++){
        t90();
        if(cmp(t2,f)){
            cout<<i;
            return 0;
        }
        strcpy();
    }
    reset();
    tfs();
    if(cmp(t2,f)){
        cout<<4;
        return 0;
    }
    strcpy();
    for(int i=1;i<=3;i++){
        t90();
        if(cmp(t2,f)){
            cout<<5;
            return 0;
        }
        strcpy();
    }
    if(cmp(g,f)){
        cout<<6;
        return 0;
    }
    cout<<7;
    return 0;
}

qaq......