当前位置: 代码迷 >> 综合 >> USACO 1.2 方块转换 (枚举)
  详细解决方案

USACO 1.2 方块转换 (枚举)

热度:142   发布时间:2023-10-09 11:44:21.0

Description

一块N x N(1<=N<=10)正方形的黑白瓦片的图案要被转换成新的正方形图案。写一个程序来找出将原始
图案按照以下列转换方法转换成新图案的最小方式:

1:转90度:图案按顺时针转90度。

2:转180度:图案按顺时针转180度。

3:转270度:图案按顺时针转270度。

4:反射:图案在水平方向翻转(形成原图案的镜像)。

5:组合:图案在水平方向翻转,然后按照#1-#3之一转换。

6:不改变:原图案不改变。

7:无效转换:无法用以上方法得到新图案。

如果有多种可用的转换方法,请选择序号最小的那个。

Input

第一行: 单独的一个整数N。
第二行到第N+1行: N行每行N个字符(不是“@”就是“-”);这是转换前的正方形。
第N+2行到第2*N+1行: N行每行N个字符(不是“@”就是“-”);这是转换后的正方形。

Output

单独的一行包括1到7之间的一个数字(在上文已描述)表明需要将转换前的正方形变为转换后的正方形的转换方法。

Sample Input

3

@-@

@@-
@-@
@–
–@
Sample Output

1

题解:

直接模拟,枚举每一种方案就行了,需要注意的是:USACO是不给用GOTO的,注意代码的清晰程度。
设a是原始状态,b是改变后的状态,右旋90度:b[j][n-i+1]=a[i][j];水平翻转:b[i][n-j+1]:=a[i][j]。

代码:

varn,i,o,p1,p2,p3,p4,p6:longint;a,b,c:array[1..20,1..20] of char;
beginreadln(n);for i:=1 to n dobeginfor o:=1 to n doread(a[i,o]);readln;end;for i:=1 to n dobeginfor o:=1 to n doread(b[i,o]);readln;end;for i:=1 to n dofor o:=1 to n doc[i,o]:=a[i,n+1-o];for i:=1 to n dofor o:=1 to n dobeginif a[i,o]<>b[n+1-i,n+1-o] then inc(p2);if a[i,o]<>b[o,n+1-i] then inc(p1);if b[i,o]<>a[o,n+1-i] then inc(p3);if a[i,o]<>b[i,n+1-o] then inc(p4);if a[i,o]<>b[i,o] then inc(p6);end;if p1=0 then writeln('1')elseif p2=0 then writeln('2')elseif p3=0 then writeln('3')elseif p4=0 then writeln('4')elseif p6=0 then writeln('6');if (p1<>0)and(p2<>0)and(p3<>0)and(p4<>0)and(p6<>0) thenbeginp1:=0;p2:=0;p3:=0;p4:=0;for i:=1 to n dofor o:=1 to n dobeginif c[i,o]<>b[n+1-i,n+1-o] then inc(p2);if c[i,o]<>b[o,n+1-i] then inc(p1);if c[i,o]<>b[i,n+1-o] then inc(p4);end;if (p1=0)or(p2=0)or(p4=0) then writeln('5') else writeln('7');end;
end.