将n*n的黑白图案按给定的七种方式中的一种转换成另外一种状态,求能够完成转换的那种方式的最小序号。这个只要从第一种方式开始依次使用每一种转换方式,直到找到可用的转换方式。spa
/* 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; } } }