题解:P1205 [USACO1.2] 方块转换 Transformations
hz_lin7532159 · · 题解
模拟……搜索……
1.题意简述:
核心转换方式
转 90°:图案按顺时针转 90°。
转 180°:图案按顺时针转 180°。
转 270°:图案按顺时针转 270°。
其它转换方式
反射:图案在水平方向翻转(以中央铅垂线为中心形成原图案的镜像)。
组合:图案在水平方向翻转,然后再按照 1∼3 之间的一种再次转换。
注:剩下两种为并无实际作用的干扰项,不影响模拟。
2.思路:
本题的核心思路就是对每种操作进行暴力模拟,不过也非完全暴力,我们可以将每种操作写成函数,然后在主函数中按序号递增的顺序进行枚举,依次判断是否能转换成新图案,这样代码就很容易写了。
3.注意事项:
(1)请注意函数的顺序,不要在函数中使用未定义内容。
(2)请注意模拟时
(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......