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.