2512 - 方块转换
时间限制 : 1 秒
内存限制 : 128 MB
一块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
C语言解答
#include<stdio.h> int t,n,a[11][11],b[11][11],c[11][11],i,j,d[11][11]; void a1() { int k,l; for(k=0,i=0;k<n;k++,i++) for(l=n-1,j=0;l>=0;l--,j++) c[i][j]=d[l][k]; } void a2() { int k,l; for(k=n-1,i=0;k>=0;k--,i++) for(l=n-1,j=0;l>=0;l--,j++) c[i][j]=d[k][l]; } void a3() { int k,l; for(k=n-1,i=0;k>=0;k--,i++) for(l=0,j=0;l<n;l++,j++) c[i][j]=d[l][k]; } void a4() { int k,l; for(k=0,i=0;k<n;k++,i++) for(l=n-1,j=0;l>=0;l--,j++) d[i][j]=a[k][l]; } void a5() { for(i=0;i<n;i++) for(j=0;j<n;j++) d[i][j]=a[i][j]; } void a6() { for(i=0;i<n;i++) for(j=0;j<n;j++) c[i][j]=d[i][j]; } int bj() { for(i=0;i<n;i++) for(j=0;j<n;j++) if(b[i][j]!=c[i][j])return(0); return(1); } void main() { char ch; while(scanf("%d\t",&n)!=EOF){ for(i=0;i<n;i++) { for(j=0;j<n;j++) { ch=getchar(); if(ch=='@')a[i][j]=2;else a[i][j]=1; } getchar(); } for(i=0;i<n;i++) { for(j=0;j<n;j++) { ch=getchar(); if(ch=='@')b[i][j]=2;else b[i][j]=1; } getchar(); } a5();a1(); if(bj())printf("1\n"); else {a2();if(bj())printf("2\n"); else {a3();if(bj())printf("3\n"); else {a4();a6();if(bj())printf("4\n"); else {a4();a1();if(bj())printf("5\n"); else {a4();a2();if(bj())printf("5\n"); else {a4();a3();if(bj())printf("5\n"); else {a5();a6();if(bj())printf("6\n"); else printf("7\n");}}}}}}}} }
C++解答
#include <bits/stdc++.h> using namespace std; #define maxn 12 int n; char aas[4][maxn][maxn]; int check(int from,int to) { for (int i=0;i<n;i++){ for (int s=0;s<n;s++){ if (aas[to][i][s]!=aas[from][i][s]) return 0; } } return 1; } void xuan(int from,int to) { for (int i=0;i<n;i++){ for (int s=0;s<n;s++){ aas[to][s][n-1-i] =aas[from][i][s]; } } } void yidong(int from,int to) { for (int i=0;i<n;i++){ for (int s=0;s<n;s++){ aas[to][i][s] = aas[from][i][n-1-s]; } } } int f(int ans) { if (ans==1){ xuan(0,2); if (check(1,2)) return 1; } if (ans==2){ xuan(0,2); xuan(2,3); if (check(1,3)) return 1; } if (ans==3){ xuan(0,2); xuan(2,3); xuan(3,2); if (check(1,2)) return 1; } if (ans==4){ yidong(0,2); if (check(2,1)) return 1; } if (ans==5){ yidong(0,2); { xuan(2,3); if (check(1,3)) return 1; xuan(3,2); if (check(1,2)) return 1; xuan(2,3); if (check(1,3)) return 1; } } if (ans==6){ if (check(0,1)) return 1; } if (ans==7){ return 1; } } int main() { while(scanf("%d",&n)!=EOF){ for (int i=0;i<n;i++){ scanf("%s",aas[0][i]); } for (int i=0;i<n;i++){ scanf("%s",aas[1][i]); } for (int i=1;i<=7;i++){ if (f(i)) { printf("%d\n",i); break; } } } return 0; }