题意很容易理解,思路也是简单的,基本上就是直接模拟。但一开始我怎么也推不出原地旋转的坐标变换表达式(空间想象力不够。。。。。),导致卡了很久。
对于一个n*n的矩形(下标从1开始),其中一点(x,y)原地旋转90°后的坐标:(y,n-x+1);原地旋转180°后的坐标:(n-x+1,n-y+1);原地旋转270°后的坐标:(n-y+1,x).得到这个公式后代码就好写了,当然我们其实只需要写一个旋转90°的函数就行了,因为180°就是旋转2次90°吗,270度就是旋转3次90°吗。
代码如下:
/*
ID: 15674811
LANG: C++
TASK: transform
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<fstream>
using namespace std;
//ifstream fin("lkl.txt");
ofstream fout("transform.out");
ifstream fin("transform.in");
int n;
char m[12][12],goal[12][12];
int check()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(m[i][j]!=goal[i][j])
return 0;
return 1;
}
void Rt_90()
{
char tmp[12][12];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
tmp[j][n-i+1]=m[i][j];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
m[i][j]=tmp[i][j];
}
///水平反射,其实就是关于中轴线对称
void Rf()
{
int k=n/2;
for(int i=1;i<=n;i++)
for(int j=1;j<=k;j++)
{
int t=m[i][j];
m[i][j]=m[i][n-j+1];
m[i][n-j+1]=t;
}
}
void solve()
{
int flag=0;
if(check())
flag=1;
for(int i=1;i<=3;i++)
{
Rt_90();
if(check())
{
fout<<i<<endl;
return;
}
}
Rt_90();///再次旋转90度使得矩形复原
Rf();
if(check())
{
fout<<"4"<<endl;
return;
}
for(int i=1;i<=3;i++)
{
Rt_90();
if(check())
{
fout<<"5"<<endl;
return;
}
}
if(flag)
{
fout<<"6"<<endl;
return ;
}
fout<<"7"<<endl;
}
int main()
{
while(fin>>n)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
fin>>m[i][j];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
fin>>goal[i][j];
solve();
}
return 0;
}
时间: 2024-10-13 04:56:00