本题可以看作是一道几何题,定义了几种基本操作:1.顺时针旋转90度、2.180度、3.270度、4.绕竖直对称轴翻转、5.组合变换(先进行4,再进行1~3中任意一种)、6.不做改变。
题目给定变换之前的图像和变换之后的图像,求让上述一种变换来实现(注意,仅仅是一种),如果有多种,输出编号最小的,如果无解,则输出“7”。
代码写出来还是比较长的,不过思路很清晰。
代码如下:
/*
ID: michael139
LANG: C
PROG: transform
*/
#include<stdio.h>
#include<string.h>
int rot90(char m[][15],char t[][15],int n);
int rot180(char m[][15],char t[][15],int n);
int rot270(char m[][15],char t[][15],int n);
int cmb(char m[][15],char t[][15],int n);
int ref(char m[][15],char t[][15],int n);
int noc(char m[][15],char t[][15],int n);
int main () {
FILE *fin = fopen ("transform.in", "r");
FILE *fout = fopen ("transform.out", "w");
int n,i,j;
char be[15][15],af[15][15];
while (fscanf(fin,"%d",&n)!=EOF) {
getc(fin);
for (i=1;i<=n;i++) {
for (j=1;j<=n;j++) {
fscanf(fin,"%c",&be[i][j]);
}
getc(fin);
}
for (i=1;i<=n;i++) {
for (j=1;j<=n;j++) {
fscanf(fin,"%c",&af[i][j]);
}
getc(fin);
}
if (rot90(be,af,n)) {
fprintf(fout,"1\n");
continue;
}
if (rot180(be,af,n)) {
fprintf(fout,"2\n");
continue;
}
if (rot270(be,af,n)) {
fprintf(fout,"3\n");
continue;
}
if (ref(be,af,n)) {
fprintf(fout,"4\n");
continue;
}
if (cmb(be,af,n)) {
fprintf(fout,"5\n");
continue;
}
if (noc(be,af,n)) {
fprintf(fout,"6\n");
continue;
}
fprintf(fout,"7\n");
}
return 0;
}
int rot90(char m[][15],char t[][15],int n) {
int i,j;
for (i=1;i<=n;i++) {
for (j=1;j<=n;j++) {
if (t[j][n-i+1]!=m[i][j]) return 0;
}
}
return 1;
}
int rot180(char m[][15],char t[][15],int n) {
int i,j;
for (i=1;i<=n;i++) {
for (j=1;j<=n;j++) {
if (t[n-i+1][n-j+1]!=m[i][j]) return 0;
}
}
return 1;
}
int rot270(char m[][15],char t[][15],int n) {
int i,j;
for (i=1;i<=n;i++) {
for (j=1;j<=n;j++) {
if (t[n-j+1][i]!=m[i][j]) return 0;
}
}
return 1;
}
int ref(char m[][15],char t[][15],int n) {
int i,j;
for (i=1;i<=n;i++) {
for (j=1;j<=n;j++) {
if (t[i][n-j+1]!=m[i][j]) return 0;
}
}
return 1;
}
int cmb(char m[][15],char t[][15],int n) {
char m2[15][15];
int i,j;
for (i=1;i<=n;i++) {
for (j=1;j<=n;j++) {
m2[i][n-j+1] = m[i][j];
}
}
if (rot90(m2,t,n) || rot180(m2,t,n) || rot270(m2,t,n)) return 1;
return 0;
}
int noc(char m[][15],char t[][15],int n) {
int i,j;
for (i=1;i<=n;i++) {
for (j=1;j<=n;j++) {
if (m[i][j]!=t[i][j]) return 0;
}
}
return 1;
}