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 }

 

你可能感兴趣的:(transform)