transform解题报告 —— icedream61 博客园(转载请注明出处)
------------------------------------------------------------------------------------------------------------------------------------------------
【题目】
给出两个N×N的矩阵A和B,找出将A转换为B的方式中编号最小的,输出编号。
#1:转90度:图案按顺时针转90度。
#2:转180度:图案按顺时针转180度。
#3:转270度:图案按顺时针转270度。
#4:反射:图案在水平方向翻转(形成原图案的镜像)。
#5:组合:图案在水平方向翻转,然后按照#1-#3之一转换。
#6:不改变:原图案不改变。
#7:无效转换:无法用以上方法得到新图案。
【数据范围】
1<=N<=10
矩阵中,只有两种字符:@或-(个人觉得没啥用,或许是为了省去一些输入输出的判断吧)
【输入样例】
3
@-@
---
@@-
@-@
@--
--@
【输出样例】
1
------------------------------------------------------------------------------------------------------------------------------------------------
【分析】
直接模拟,注意别转反了就好(个人建议打印出来看看)。
------------------------------------------------------------------------------------------------------------------------------------------------
【总结】
我就转反了……
还有个地方要注意,就是转180度的时候,第一反应八成是直接用上次转90度的结果继续转,但别忘了如果原地转(在同一个矩阵中转,而不申请新的空间)是一定会错的-.-
------------------------------------------------------------------------------------------------------------------------------------------------
【代码】
1 /* 2 ID: icedrea1 3 PROB: transform 4 LANG: C++ 5 */ 6 7 #include <iostream> 8 #include <fstream> 9 using namespace std; 10 11 int N; 12 typedef char Map[10+1][10+1]; 13 Map A,B; 14 15 void PP(Map x) 16 { 17 for(int i=0;i!=N;++i) 18 { 19 for(int j=0;j!=N;++j) cout<<x[i][j]; 20 cout<<endl; 21 } 22 cout<<"------------------------------------"<<endl; 23 } 24 void get(Map x,Map y) 25 { 26 for(int i=0;i!=N;++i) 27 for(int j=0;j!=N;++j) x[i][j]=y[i][j]; 28 } 29 bool same(Map x,Map y) 30 { 31 for(int i=0;i!=N;++i) 32 for(int j=0;j!=N;++j) 33 if(x[i][j]!=y[i][j]) return false; 34 return true; 35 } 36 int work() 37 { 38 Map t,k; 39 40 PP(A); PP(B); 41 42 // #1 (i,j)=(N-1-j,i) 43 get(k,A); 44 for(int i=0;i!=N;++i) 45 for(int j=0;j!=N;++j) t[i][j]=k[N-1-j][i]; 46 PP(t); 47 if(same(t,B)) return 1; 48 49 // #2 #1×2 50 get(k,t); 51 for(int i=0;i!=N;++i) 52 for(int j=0;j!=N;++j) t[i][j]=k[N-1-j][i]; 53 PP(t); 54 if(same(t,B)) return 2; 55 56 // #3 #1×3 57 get(k,t); 58 for(int i=0;i!=N;++i) 59 for(int j=0;j!=N;++j) t[i][j]=k[N-1-j][i]; 60 if(same(t,B)) return 3; 61 62 // #4 (i,j)=(i,N-1-j) 63 get(k,A); 64 for(int i=0;i!=N;++i) 65 for(int j=0;j!=N;++j) t[i][j]=k[i][N-1-j]; 66 if(same(t,B)) return 4; 67 68 // #5 #4 + #1~3 69 get(k,t); 70 for(int i=0;i!=N;++i) 71 for(int j=0;j!=N;++j) t[i][j]=k[N-1-j][i]; 72 if(same(t,B)) return 5; 73 get(k,t); 74 for(int i=0;i!=N;++i) 75 for(int j=0;j!=N;++j) t[i][j]=k[N-1-j][i]; 76 if(same(t,B)) return 5; 77 get(k,t); 78 for(int i=0;i!=N;++i) 79 for(int j=0;j!=N;++j) t[i][j]=k[N-1-j][i]; 80 if(same(t,B)) return 5; 81 82 // #6 no change 83 if(same(A,B)) return 6; 84 85 // #7 impossible 86 return 7; 87 } 88 89 int main() 90 { 91 ifstream in("transform.in"); 92 ofstream out("transform.out"); 93 94 in>>N; in.get(); 95 for(int i=0;i!=N;++i) 96 { 97 for(int j=0;j!=N;++j) A[i][j]=in.get(); 98 in.get(); 99 } 100 for(int i=0;i!=N;++i) 101 { 102 for(int j=0;j!=N;++j) B[i][j]=in.get(); 103 in.get(); 104 } 105 106 out<<work()<<endl; 107 108 in.close(); 109 out.close(); 110 return 0; 111 }