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]。
代码:
var
n,i,o,p1,p2,p3,p4,p6:longint;
a,b,c:array[1..20,1..20] of char;
begin
readln(n);
for i:=1 to n do
begin
for o:=1 to n do
read(a[i,o]);
readln;
end;
for i:=1 to n do
begin
for o:=1 to n do
read(b[i,o]);
readln;
end;
for i:=1 to n do
for o:=1 to n do
c[i,o]:=a[i,n+1-o];
for i:=1 to n do
for o:=1 to n do
begin
if 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')
else
if p2=0 then writeln('2')
else
if p3=0 then writeln('3')
else
if p4=0 then writeln('4')
else
if p6=0 then writeln('6');
if (p1<>0)and(p2<>0)and(p3<>0)and(p4<>0)and(p6<>0) then
begin
p1:=0;
p2:=0;
p3:=0;
p4:=0;
for i:=1 to n do
for o:=1 to n do
begin
if 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.