將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; } } }