一块 n×n 正方形的黑白瓦片的图案要被转换成新的正方形图案。写一个程序来找出将原始图案按照以下列转换方法转换成新图案的最小方式:
-
转 90°90°:图案按顺时针转 90°90°。
-
转 180°180°:图案按顺时针转 180°180°。
-
转 270°270°:图案按顺时针转 270°270°。
-
反射:图案在水平方向翻转(以中央铅垂线为中心形成原图案的镜像)。
-
组合:图案在水平方向翻转,然后再按照 1∼31∼3 之间的一种再次转换。
-
不改变:原图案不改变。
-
无效转换:无法用以上方法得到新图案。
如果有多种可用的转换方法,请选择序号最小的那个。
只使用上述 77 个中的一个步骤来完成这次转换。
输入格式
第一行一个正整数 n。
然后 n 行,每行 n 个字符,全部为 @
或 -
,表示初始的正方形。
接下来 n 行,每行 n 个字符,全部为 @
或 -
,表示最终的正方形。
输出格式
单独的一行包括 1∼71∼7 之间的一个数字(在上文已描述)表明需要将转换前的正方形变为转换后的正方形的转换方法。
#include<bits/stdc++.h>
using namespace std;
char a[11][11],b[11][11];
int main(){
int n,sum[10]={0},m=0;
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 >> b[i][j];
}
}
for(int i=1; i<=n; i++){
for(int j=1; j<=n; j++){
if(a[i][j] == b[j][n-i+1])sum[1]++;//1
if(a[i][j] == b[n-i+1][n-j+1])sum[2]++;//2
if(a[i][j] == b[n-j+1][i])sum[3]++;//3
if(a[i][j] == b[i][n-j+1])sum[4]++;//4反射
if(a[i][j] == b[i][j])sum[6]++;//6
//j = n-j+1 5组合,因为它是先水平翻转再进行顺时针旋转的
//也就是先 4 再进行 1~3 所以这里就直接把j = n-j+1 带进
if(a[i][j] == b[n-j+1][n-i+1])sum[5]++;
if(a[i][j] == b[n-i+1][j])sum[8]++;
if(a[i][j] == b[j][i])sum[7]++;
}
}
for(int i=1; i<10; i++){
if(sum[i] == n*n){
if(i<=6){
cout << i << endl;
m = 1;
break;
}
else{
cout << '5' << endl;
m = 1;
}
}
}
if(m == 0)cout << '7' << endl;
return 0;
}
写着道题的时候用了两个小时才写出来的,也看了好多人的题解发现他们的比较长,感觉还是自己写的比较简短通俗一点
顺便也记录下自己的第一个普及/提高−题,时间越来越近,留给自己的时间真的不多了,加油!