题目大意:
一块N x N(1<=N<=10)正方形的黑白瓦片的图案要被转换成新的正方形图案。写一个程序来找出将原始 图案按照以下列转换方法转换成新图案的最小方式: #1:转90度:图案按顺时针转90度。 #2:转180度:图案按顺时针转180度。 #3:转270度:图案按顺时针转270度。 #4:反射:图案在水平方向翻转(形成原图案的镜像)。 #5:组合:图案在水平方向翻转,然后按照#1-#3之一转换。 #6:不改变:原图案不改变。 #7:无效转换:无法用以上方法得到新图案。 如果有多种可用的转换方法,请选择序号最小的那个。 PROGRAM NAME: transform INPUT FORMAT 第一行: 单独的一个整数N。 第二行到第N+1行: N行每行N个字符(不是“@”就是“-”);这是转换前的正方形。 第N+2行到第2*N+1行: N行每行N个字符(不是“@”就是“-”);这是转换后的正方形。 SAMPLE INPUT (file transform.in) 3 @-@ --- @@- @-@ @-- --@ OUTPUT FORMAT 单独的一行包括1到7之间的一个数字(在上文已描述)表明需要将转换前的正方形变为转换后的正方形的 转换方法。 SAMPLE OUTPUT (file transform.out) 1
思路:只需要知道向左旋和反转的坐标的变化即可;
左旋:列坐标变为横坐标, 列坐标用n+1减去横坐标(横坐标起始为1)
反转:横坐标不变, 列坐标变为n+1减去当前列坐标(列坐标起始位1)
然后就是函数的调用
code:
#include <stdio.h> #include <iostream> #include <algorithm> using namespace std; int n = 0; char map1[12][12], map2[12][12], map3[12][12], map4[12][12]; void rotate(char map[12][12]) { int i = 0, j = 0; for(i = 1; i<=n; i++) for(j = 1; j<=n; j++) map2[j][n+1-i] = map[i][j]; } void mirror(char map[12][12]) { int i = 0, j = 0; for(i = 1; i<=n; i++) { for(j = n; j>0; j--) { map3[i][n-j+1] = map[i][j]; } } } int equal(char map2[12][12]) { int i = 0, j = 0; for(i = 1; i<=n; i++) for(j = 1; j<=n; j++) if(map1[i][j] != map2[i][j]) return 0; return 1; } int solve(char map[][12])//把形参map1旋转 { int i = 0, j = 0; rotate(map); if(equal(map2)) return 1; else { for(i = 1; i<=n; i++) for(j = 1; j<=n; j++) map3[i][j] = map2[i][j]; rotate(map3); if(equal(map2)) return 2; else { for(i = 1; i<=n; i++) for(j = 1; j<=n; j++) map3[i][j] = map2[i][j]; rotate(map2); if(equal(map2)) return 3; } } return 0; } int main() { freopen("transform.in", "r", stdin); freopen("transform.out", "w", stdout); int i = 0, j = 0, ans = 0; cin>>n; for(i = 1; i<=n; i++) for(j = 1; j<=n; j++) cin>>map4[i][j]; for(i = 1; i<=n; i++) for(j = 1; j<=n; j++) cin>>map1[i][j]; if(ans = solve(map4)); else { mirror(map4); if(equal(map3)) ans = 4; else if(solve(map3)) ans = 5; else if(equal(map4)) ans = 6; else ans = 7; } cout<<ans<<endl; return 0; }