[USACO1.2]方块转换 Transformations
这题写的好长。。。。
可以放到坐标系里考虑
eg:(x,y)和(-x,-y)中心对称,放到数组里就是(-x+n+1,-y+n+1)
#include<cstdio>
#include<cstring>
using namespace std;
int n;
char s1[30][30],s2[30][30];
bool plan1(){
int i,j;
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
if(s1[i][j]!=s2[j][n-i+1])
return false;
}
}
return true;
}
bool plan2(){
int i,j;
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
if(s1[i][j]!=s2[n-i+1][n-j+1])
return false;
}
}
return true;
}
bool plan3(){
int i,j;
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
if(s1[i][j]!=s2[n-j+1][i])
return false;
}
}
return true;
}
bool plan4(){
int i,j;
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
if(s1[i][j]!=s2[i][n-j+1])
return false;
}
}
return true;
}
bool plan5(){
int i,j;
int cnt1=0,cnt2=0,cnt3=0;
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
if(s1[i][j]==s2[n-j+1][n-i+1])
cnt1++;
}
}
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
if(s1[i][j]==s2[n-i+1][n-(n-j+1)+1])
cnt2++;
}
}
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
if(s1[i][j]==s2[n-(n-j+1)+1][i])
cnt3++;
}
}
if(cnt1==n*n || cnt2==n*n || cnt3==n*n)
return true;
else
return false;
}
bool plan6(){
int i,j;
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
if(s1[i][j]!=s2[i][j])
return false;
}
}
return true;
}
void solve(){
if(plan1()){
printf("1\n");
return;
}
if(plan2()){
printf("2\n");
return;
}
if(plan3()){
printf("3\n");
return;
}
if(plan4()){
printf("4\n");
return;
}
if(plan5()){
printf("5\n");
return;
}
if(plan6()){
printf("6\n");
return;
}
printf("7\n");
}
int main(){
scanf("%d",&n);
int i;
for(i=1;i<=n;i++){
scanf("%s",s1[i]+1);
}
for(i=1;i<=n;i++){
scanf("%s",s2[i]+1);
}
solve();
return 0;
}