[USACO1.2] 方块转换 Transformations
洛谷P1205 点这里查看原题
难度:普及-
题目描述
一块 n × n n \times n n×n 正方形的黑白瓦片的图案要被转换成新的正方形图案。写一个程序来找出将原始图案按照以下列转换方法转换成新图案的最小方式:
-
转 90 ° 90\degree 90°:图案按顺时针转 90 ° 90\degree 90°。
-
转 180 ° 180\degree 180°:图案按顺时针转 180 ° 180\degree 180°。
-
转 270 ° 270\degree 270°:图案按顺时针转 270 ° 270\degree 270°。
-
反射:图案在水平方向翻转(以中央铅垂线为中心形成原图案的镜像)。
-
组合:图案在水平方向翻转,然后再按照 1 ∼ 3 1 \sim 3 1∼3 之间的一种再次转换。
-
不改变:原图案不改变。
-
无效转换:无法用以上方法得到新图案。
如果有多种可用的转换方法,请选择序号最小的那个。
只使用上述 7 7 7 个中的一个步骤来完成这次转换。
输入格式
第一行一个正整数 n n n。
然后
n
n
n 行,每行
n
n
n 个字符,全部为 @
或 -
,表示初始的正方形。
接下来
n
n
n 行,每行
n
n
n 个字符,全部为 @
或 -
,表示最终的正方形。
输出格式
单独的一行包括 1 ∼ 7 1 \sim 7 1∼7 之间的一个数字(在上文已描述)表明需要将转换前的正方形变为转换后的正方形的转换方法。
样例 #1
样例输入 #1
3
@-@
---
@@-
@-@
@--
--@
样例输出 #1
1
提示
【数据范围】
对于
100
%
100\%
100% 的数据,
1
≤
n
≤
10
1\le n \le 10
1≤n≤10。
题目翻译来自 NOCOW。
USACO Training Section 1.2
答案
#include<bits/stdc++.h>
using namespace std;
int n;
char fir[11][11],sav[11][11],cha[11][11],las[11][11];
bool trans1(){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cha[j][n-i+1]=fir[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(cha[i][j]!=las[i][j]) return 0;
}
}
return 1;
}
bool trans2(){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cha[n-i+1][n-j+1]=fir[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(cha[i][j]!=las[i][j]) return 0;
}
}
return 1;
}
bool trans3(){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cha[n-j+1][i]=fir[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(cha[i][j]!=las[i][j]) return 0;
}
}
return 1;
}
bool trans4(){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cha[i][n-j+1]=fir[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(cha[i][j]!=las[i][j]) return 0;
}
}
return 1;
}
bool trans51(){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
sav[i][n-j+1]=fir[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cha[j][n-i+1]=sav[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(cha[i][j]!=las[i][j]) return 0;
}
}
return 1;
}
bool trans52(){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
sav[i][n-j+1]=fir[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cha[n-i+1][n-j+1]=sav[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(cha[i][j]!=las[i][j]) return 0;
}
}
return 1;
}
bool trans53(){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
sav[i][n-j+1]=fir[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cha[n-j+1][i]=sav[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(cha[i][j]!=las[i][j]) return 0;
}
}
return 1;
}
bool trans6(){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(cha[i][j]!=las[i][j]) return 0;
}
}
return 1;
}
void judge(){
if(trans1()){
cout << 1;
return ;
}
if(trans2()){
cout << 2;
return ;
}
if(trans3()){
cout << 3;
return ;
}
if(trans4()){
cout << 4;
return ;
}
if(trans51() or trans52() or trans53()){
cout << 5;
return ;
}
if(trans6()){
cout << 6;
return ;
}
cout << 7;
}
int main(){
cin >> n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin >> fir[i][j];
sav[i][j] = fir[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin >> las[i][j];
}
}
judge();
return 0;
}