USACO-Chapter1-Section 1.2-Transformations (transform)
【问题描述】
一块N x N(1<=N<=10)正方形的黑白瓦片的图案要被转换成新的正方形图案。写一个程序来找出将原始图案按照以下列转换方法转换成新图案的最小方式:
1:转90度:图案按顺时针转90度。
2:转180度:图案按顺时针转180度。
3:转270度:图案按顺时针转270度。
4:反射:图案在水平方向翻转(以中央铅垂线为中心形成原图案的镜像)。
5:组合:图案在水平方向翻转,然后再按照1到3之间的一种再次转换。
6:不改变:原图案不改变。
7:无效转换:无法用以上方法得到新图案。
如果有多种可用的转换方法,请选择序号最小的那个。
一个步骤就要搞定
【输入格式】
第一行: 单独的一个整数N。
第二行到第N+1行: N行每行N个字符(不是“@”就是“-”);这是转换前的正方形。
第N+2行到第2*N+1行: N行每行N个字符(不是“@”就是“-”);这是转换后的正方形。
【输出格式】
单独的一行包括1到7之间的一个数字(在上文已描述)表明需要将转换前的正方形变为转换后的正方形的转换方法。
【输入样例】
3 @-@ --- @@- @-@ @-- --@
【输出样例】
1
【思想】
对于转换问题,这里我给出大家公式,具体可以自己做推导,这里不再赘述,由题意可知,旋转只需要知道顺时针90°和镜像对称即可。我用一个三维数组记录下了从编号1-6的所有变换,为什么这么记录呢?因为比如旋转270°,我们这里可以直接按照90°的变换公式去改变180°的记录即为F(g[2,i,j])->g[3,i,j],[F为变换公式]。然后按照题目模拟即可。
- 水平翻转:
- b[i,n-j+1]:=a[i,j]
- 右旋90度:
- b[j,n-i+1]:=a[i,j]
【代码】
- Executing...
- Test 1: TEST OK [0.000 secs, 308 KB]
- Test 2: TEST OK [0.000 secs, 308 KB]
- Test 3: TEST OK [0.000 secs, 308 KB]
- Test 4: TEST OK [0.000 secs, 308 KB]
- Test 5: TEST OK [0.000 secs, 308 KB]
- Test 6: TEST OK [0.000 secs, 308 KB]
- Test 7: TEST OK [0.000 secs, 308 KB]
- Test 8: TEST OK [0.000 secs, 308 KB]
- All tests OK.
{ ID : c_CaM.19 LANG: PASCAL TASK: transform } Program CaM(input,output); Var i,j,n,ff,k:longint; a,b:array[0..50,0..50] of char; g:array[0..10,0..50,0..50] of char; Function ok(t:longint):boolean; Var i,j:longint; Begin for i:=1 to n do for j:=1 to n do if g[t,i,j]<>b[i,j] then exit(false); exit(true); End; Procedure innt; Begin assign(input,'transform.in'); reset(input); assign(output,'transform.out'); rewrite(output); End; Procedure outt; Begin close(input); close(output); End; Begin innt; readln(n); for i:=1 to n do Begin for j:=1 to n do Begin read(a[i,j]); g[0,i,j]:=a[i,j]; End; readln; End; for i:=1 to n do Begin for j:=1 to n do read(b[i,j]); readln; End; for k:=1 to 3 do Begin for i:=1 to n do for j:=1 to n do g[k,j,n-i+1]:=g[k-1,i,j]; if ok(k) then Begin writeln(k); outt; halt; End; End; for i:=1 to n do for j:=1 to n do g[4,i,n-j+1]:=a[i,j]; if ok(4) then Begin writeln(4); outt; halt; End; for k:=5 to 7 do Begin for i:=1 to n do for j:=1 to n do g[k,j,n-i+1]:=g[k-1,i,j]; if ok(k) then Begin writeln(5); outt; halt; End; End; for i:=1 to n do for j:=1 to n do if a[i,j]<>b[i,j] then ff:=1; if ff=0 then Begin writeln(6); outt; halt; End; writeln(7); outt; End.