分析
朴素的思想就是模拟翻转矩阵,官方的题解也是这样的。
但是如果数据量大的话,这种方法有点浪费。luogu上有个比较好的想法–剪枝
即在做变形的时候同时做判断,如果和当前char与目标矩阵不同就直接跳过,可以节省时间。
代码
只写的来暴力模拟orz
/*
PROG:transform
ID:imking022
LANG:C++
*/
#include <iostream>
#include <cstdio>
#include <fstream>
#include <cstdlib>
#include <algorithm>
using namespace std;
int n;
char **cot, **tar, **hod,**reg;
void putmat(char **a){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
}
bool equal(char **a, char **b){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)
if(a[i][j] != b[i][j])
return false;
}
return true;
}
void rotate(int t){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++) hod[i][j] = cot[i][j];
}
while(t--){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
reg[j][n-i-1]=hod[i][j];
}
}
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
hod[i][j] = reg[i][j];
}
}
void reflect(){
int i=0,j=n-1;
while(i<j){
for(int k=0;k<n;k++){
swap(cot[k][i],cot[k][j]);
}
i++,j--;
}
}
int main(void){
freopen("transform.out","w",stdout);
freopen("transform.in","r",stdin);
cin>>n;
cot = (char **)malloc(n*sizeof(char*));
tar = (char **)malloc(n*sizeof(char*));
hod = (char **)malloc(n*sizeof(char*));
reg = (char **)malloc(n*sizeof(char*));
for(int i=0;i<n;i++){
cot[i] = (char *)malloc(n*sizeof(char));
tar[i] = (char *)malloc(n*sizeof(char));
hod[i] = (char *)malloc(n*sizeof(char));
reg[i] = (char *)malloc(n*sizeof(char));
for(int j=0;j<n;j++) cin>>cot[i][j];
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++) cin>>tar[i][j];
}
for(int t=1;t<=3;t++){
rotate(t);
if(equal(hod,tar)){
cout<<t<<endl;
return 0;
}
}
reflect();
if(equal(cot,tar)) {
cout<<4<<endl;
return 0;
}
for(int t=1;t<=3;t++){
rotate(t);
if(equal(hod,tar)){
cout<<5<<endl;
return 0;
}
}
if(equal(cot,tar)) {
cout<<6<<endl;
return 0;
}
cout<<7<<endl;
return 0;
}