USACO Section1.2 Transformations 解题报告

  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 }

 

posted on 2015-03-08 23:26  IceDream61  阅读(197)  评论(0编辑  收藏  举报

导航