#include using namespace std; const int N = 15; char a[N][N];//原始图案 char c[N][N];//目标图案 char t[N][N];//转换后的图案 char t2[N][N]; int n; //判断两个二维数组是不是一致 bool equal() { for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) if (t[i][j] != c[i][j]) return false; return true; } int main() { cin >> n; //读入原始图案 for (int i = 1; i <= n; ++i) for (int j = 1; j <= n; ++j) cin >> a[i][j]; //读入目标图案 for (int i = 1; i <= n; ++i) for (int j = 1; j <= n; ++j) cin >> c[i][j]; //1、顺时针转90度 //通过实际例子,找规律,得i,j--->j,n-i+1 /** 1 2 3 7 4 1 4 5 6 --> 8 5 2 7 8 9 9 6 3 以数字1为例,原来的坐标(1,1),现在的坐标(1,3) 以数字2为例,原来的坐标(1,2),现在的坐标(2,3) 以数字3为例,原来的坐标(1,3),现在的坐标(3,3) 成功发现列坐标变成了行坐标。那么行坐标呢?它是怎么变化的呢? 以7,8,9为例,它们原来在不同的列,现在都是第1列,看来后期的 列与行有关,当然也得与n有关,所以猜测试为n-i,结果呢,3-3=0,不对啊, 再加个1试试,就是n-i+1,再验算一下,完全正确! */ for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) t[j][n - i + 1] = a[i][j]; //如果通过,输出1,返回 if (equal()) { cout << 1 << endl; return 0; } //2、顺时针转180度 /** 1 2 3 9 8 7 4 5 6 --> 6 5 4 7 8 9 3 2 1 用纸画出来模拟一下 找规律 1,1--->n,n 1,2--->n,n-1 1,3--->n,n-2 2,1--->n-1,n 2,2--->n-1,n-1 总结 : i,j---> n-i+1,n-j+1 */ for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) t[n - i + 1][n - j + 1] = a[i][j]; //如果通过,输出2,返回 if (equal()) { cout << 2 << endl; return 0; } //3、顺时针转270度 //通过实际例子,找规律,得i,j---> n-j+1,i /** 1 2 3 3 6 9 4 5 6 --> 2 5 8 7 8 9 1 4 7 用纸画出来模拟一下 找规律 1,1--->n,1 1,2--->n-1,1 1,3--->n-2,1 2,1--->n,2 2,2--->n-1,2 总结 : i,j---> n-j+1,i */ for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) t[n - j + 1][i] = a[i][j]; //如果通过,输出3,返回 if (equal()) { cout << 3 << endl; return 0; } //4、图案在水平方向翻转 //通过实际例子, /** 1 2 3 3 2 1 4 5 6 --> 6 5 4 7 8 9 9 8 7 用纸画出来模拟一下 找规律 1,1--->1,n 1,2--->1,n-1 1,3--->1,n-2 2,1--->2,n 2,2--->2,n-1 总结 : i,j---> i,n-j+1 */ for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) t[i][n - j + 1] = a[i][j]; //如果通过,输出4,返回 if (equal()) { cout << 4 << endl; return 0; } //5、组合 图案在水平方向翻转,然后再按照 1 ∼3 之间的一种再次转换。 //*********************************************************************************************** //5.1 水平+顺时针90度 //水平 for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) t[i][n - j + 1] = a[i][j]; //复制出来 for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) t2[i][j] = t[i][j]; //顺时针90度 for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) t[j][n - i + 1] = t2[i][j]; //如果通过,输出5,返回 if (equal()) { cout << 5 << endl; return 0; } //*********************************************************************************************** //*********************************************************************************************** //5.2 水平+180度 for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) t[i][n - j + 1] = a[i][j]; for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) t2[i][j] = t[i][j]; for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) t[n - i + 1][n - j + 1] = t2[i][j]; //如果通过,输出5,返回 if (equal()) { cout << 5 << endl; return 0; } //*********************************************************************************************** //*********************************************************************************************** //5.3 水平+270度 for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) t[i][n - j + 1] = a[i][j]; for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) t2[i][j] = t[i][j]; for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) t[n - j + 1][i] = t2[i][j]; //如果通过,输出5,返回 if (equal()) { cout << 5 << endl; return 0; } //*********************************************************************************************** //6、不改变 for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) t[i][j] = a[i][j]; //如果通过,输出6,返回 if (equal()) { cout << 6 << endl; return 0; } //7、无效转换 cout << 7 << endl; return 0; }