[USACO1.2] 方块转换 Transformations
题目描述
一块 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
package rumen4;
import java.util.Scanner;
public class 方块转换 {
static char c[][];
public static void xz(char[][] a,int n) {
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
c[j][n-i-1]=a[i][j];
}
public static void fs(char[][] a,int n) {
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
c[i][j]=a[i][n-j-1];
}
public static int judge(char[][] a,char[][] b) {
for(int i=0;i<a.length;i++)
for(int j=0;j<a.length;j++)
if(a[i][j]!=b[i][j])return 0;
return 1;
}
public static void main(String[] args) {
Scanner wc=new Scanner (System.in);
int n = wc.nextInt();
char a[][]=new char[n][n];
char b[][]=new char[n][n];
c=new char[n][n];
for (int i = 0; i < n; i++) {
String str=wc.next();
for (int j = 0; j < n; j++) {
a[i][j]=str.charAt(j);
}
}
for (int i = 0; i < n; i++) {
String str=wc.next();
for (int j = 0; j < n; j++) {
b[i][j]=str.charAt(j);
}
}
xz(a,n); //旋转第一次90度
if(judge(c,b)==1) {System.out.println(1);return;}
for(int i=0;i<a.length;i++)
for(int j=0;j<a.length;j++)
a[i][j]=c[i][j];
xz(a,n); //旋转第二次180度
if(judge(c,b)==1){System.out.println(2);return;}
for(int i=0;i<a.length;i++)
for(int j=0;j<a.length;j++)
a[i][j]=c[i][j];
xz(a,n); //旋转第三次270度
if(judge(c,b)==1){System.out.println(3);return;}
for(int i=0;i<a.length;i++)
for(int j=0;j<a.length;j++)
a[i][j]=c[i][j];
xz(a,n); //旋转第四次360度 恢复原样
for(int i=0;i<a.length;i++)
for(int j=0;j<a.length;j++)
a[i][j]=c[i][j];
fs(a,n); //翻转
if(judge(c,b)==1){System.out.println(4);return;}
for(int i=0;i<a.length;i++)
for(int j=0;j<a.length;j++)
a[i][j]=c[i][j];
xz(a,n); //翻转后旋转一次
if(judge(c,b)==1){System.out.println(5);return;}
for(int i=0;i<a.length;i++)
for(int j=0;j<a.length;j++)
a[i][j]=c[i][j];
xz(a,n); //翻转后旋转二次
if(judge(c,b)==1){System.out.println(5);return;}
for(int i=0;i<a.length;i++)
for(int j=0;j<a.length;j++)
a[i][j]=c[i][j];
xz(a,n); //翻转后旋转三次
if(judge(c,b)==1){System.out.println(5);return;}
for(int i=0;i<a.length;i++)
for(int j=0;j<a.length;j++)
a[i][j]=c[i][j];
xz(a,n); //翻转后旋转四次
for(int i=0;i<a.length;i++)
for(int j=0;j<a.length;j++)
a[i][j]=c[i][j];
fs(a,n); //再翻转恢复
if(judge(c,b)==1){System.out.println(6);return;}
System.out.println(7);
}
}