将n*n的黑白图案按给定的七种方式中的一种转换成另一种状态,求可以完成转换的那种方式的最小序号。这个只要从第一种方式开始依次使用每一种转换方式,直到找到可用的转换方式。
/*
ID: whutzha1
PROG: transform
LANG: C++
*/
#include<fstream>
using namespace std;
ifstream cin("transform.in");
ofstream cout("transform.out");
bool compare(char arr1[10][10],char arr2[10][10],int n);
void change1(char arr1[10][10],int n);
void change2(char arr1[10][10],int n);
int main()
{
char arr1[10][10],arr2[10][10],arr3[10][10];
bool flag=false;
int n;
cin>>n;
int i,j;
for (i=0;i<n;i++)
for (j=0;j<n;j++)
cin>>arr1[i][j];
for (i=0;i<n;i++)
for (j=0;j<n;j++)
cin>>arr2[i][j];
int ans=7;
//方案1 转90度
for (i=0;i<n;i++)
for (j=0;j<n;j++)
arr3[i][j]=arr1[i][j];
change1(arr3,n);
if (compare(arr2,arr3,n))
{
ans=1;
goto result;
}
//方案2 转180度
change1(arr3,n);
if (compare(arr2,arr3,n))
{
ans=2;
goto result;
}
//方案3 转270度
change1(arr3,n);
if (compare(arr2,arr3,n))
{
ans=3;
goto result;
}
//方案4 水平翻转
for (i=0;i<n;i++)
for (j=0;j<n;j++)
arr3[i][j]=arr1[i][j];
change2(arr3,n);
if (compare(arr2,arr3,n))
{
ans=4;
goto result;
}
//方案5 水平翻转再按方案1-3中的一种转换
change1(arr3,n);
if (compare(arr2,arr3,n))
{
ans=5;
goto result;
}
change1(arr3,n);
if (compare(arr2,arr3,n))
{
ans=5;
goto result;
}
change1(arr3,n);
if (compare(arr2,arr3,n))
{
ans=5;
goto result;
}
//方案6 不改变原图案
if (compare(arr1,arr2,n))
{
ans=6;
goto result;
}
//无法完成转换 结果则为7
result: cout<<ans<<endl;
return 0;
}
bool compare(char arr1[10][10],char arr2[10][10],int n) //判断图案是否相同
{
int i,j;
bool flag=true;
for (i=0;i<n;i++)
for (j=0;j<n;j++)
{
if (arr1[i][j]!=arr2[i][j])
{flag=false;break;}
}
return flag;
}
void change1(char arr1[10][10],int n) //转90度
{
char arr[10][10];
int i,j;
for (i=0;i<n;i++)
for (j=0;j<n;j++)
{
arr[i][j]=arr1[i][j];
}
for (i=0;i<n;i++)
for (j=0;j<n;j++)
{
arr1[i][j]=arr[n-1-j][i];
}
}
void change2(char arr1[10][10],int n) //水平翻转
{
int i,j;
char temp;
for (i=0;i<n;i++)
{
for (j=0;j<n/2;j++)
{
temp=arr1[i][j];
arr1[i][j]=arr1[i][n-1-j];
arr1[i][n-1-j]=temp;
}
}
}