洛谷 Transformations 方块转换
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
判断原有的正方体经过哪种变换后得到给定的正方体,数据量不大,第一思路是暴力,但是写起来太麻烦了。
分析,因为旋转的方式是固定的,所以说原正方体中的每一个坐标都可以用公式来表示出变换后的坐标,因此只需要遍历一遍正方体中所有的点即可。
点与点之间的联系,每个点变换后的位置已经确定,一次遍历。
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<string> 5 #include<cmath> 6 #include<algorithm> 7 #include<queue> 8 #include<stack> 9 #include<deque> 10 #include<map> 11 #include<iostream> 12 using namespace std; 13 typedef long long LL; 14 const double pi=acos(-1.0); 15 const double e=exp(1); 16 const int N = 10009; 17 18 int a[15][15],b[15][15]; 19 int check[10]; 20 int n; 21 22 void judge(int m) 23 { 24 int i,p,j; 25 for(i=0; i<n; i++) 26 { 27 for(j=0; j<n; j++) 28 { 29 if(a[i][j]!=b[j][n-1-i]) 30 check[m+1]=1; 31 if(a[i][j]!=b[n-1-i][n-1-j]) 32 check[m+2]=1; 33 if(a[i][j]!=b[n-1-j][i]) 34 check[m+3]=1; 35 } 36 } 37 } 38 int main() 39 { 40 int i,p,j; 41 scanf("%d",&n); 42 for(i=0; i<n; i++) 43 for(j=0; j<n; j++) 44 scanf(" %c",&a[i][j]); 45 46 int flag=0; 47 for(i=0; i<n; i++) 48 for(j=0; j<n; j++) 49 { 50 scanf(" %c",&b[i][j]); 51 if(a[i][j]!=b[i][j]) 52 flag=1; 53 } 54 memset(check,0,sizeof(check)); 55 judge(0); 56 57 for(i=0; i<n; i++) 58 for(j=0; j<=(n-1)/2; j++) 59 { 60 char c=a[i][j]; 61 a[i][j]=a[i][n-1-j]; 62 a[i][n-1-j]=c; 63 } 64 for(i=0;i<n;i++) 65 for(j=0;j<n;j++) 66 if(a[i][j]!=b[i][j]) 67 check[4]=1; 68 69 judge(4); 70 while(1) 71 { 72 for(i=1;i<=4;i++) 73 if(!check[i]) 74 { 75 printf("%d\n",i); 76 break; 77 } 78 if(i<=4) 79 break; 80 if(check[5]==0||check[6]==0||check[7]==0) 81 { 82 printf("5\n"); 83 break; 84 } 85 if(flag==0) 86 { 87 printf("6\n"); 88 break; 89 } 90 91 printf("7\n"); 92 break; 93 } 94 95 return 0; 96 }