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
  @[email protected]
  ---
  @@-
  @[email protected]
  @--
  [email protected]
【输出样例】
  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 }
时间: 2024-10-29 19:07:41

USACO Section1.2 Transformations 解题报告的相关文章

USACO Section1.3 Wormholes 解题报告

wormhole解题报告 —— icedream61 博客园(转载请注明出处)------------------------------------------------------------------------------------------------------------------------------------------------[题目] 一个人在二维坐标系上走,方向永远是+x.此坐标系中有N个虫洞(N是偶数). 虫洞这东西,一旦两个配成一对,便可以形成“传送门

USACO 1.4 ariprog 解题报告

这是继虫洞之后又让我为难的一个 剪枝题目,无论如何,做的再快,也只能过6个点,最后三个点也TLE.后来参考了一下标答,大概思路是这样的. 朴素算法就不多说了,枚举a,b然后判断就行,网上说这样优化到位的话,是可能过掉的,但是我一直没有优化出来,所以就放弃了这一做法.. 标答的做法:首先要预处理一下所有的双平方数,我的做法是只用BOOL标记,但是这里还要存一下数的序列.然后,我们知道,我们要找的等差数列中的第一个数一定是这里面的数,那么就利用这一个特点,每次从公差开始枚举,如果序列长度还不够,但是

USACO Section1.4 Mother&#39;s Milk 解题报告

milk3解题报告 —— icedream61 博客园(转载请注明出处)------------------------------------------------------------------------------------------------------------------------------------------------[题目] 有三个桶,容量分别是A.B.C,开始C桶是满的. 你可以不断将某个桶的奶倒到另一个桶里,但只允许全倒过去,或者将后者倒满,前者留下

USACO Section1.5 Prime Palindromes 解题报告

pprime解题报告 —— icedream61 博客园(转载请注明出处)------------------------------------------------------------------------------------------------------------------------------------------------[题目] 求a到b之间的所有回文素数(即又是素数又是回文数的数).[数据范围] 5<=a,b<=100,000,000[输入样例] 5

USACO Section1.2 Name That Number 解题报告

namenum解题报告 —— icedream61 博客园(转载请注明出处)------------------------------------------------------------------------------------------------------------------------------------------------[题目] 你有一个手机,键盘如下所示: 2: A,B,C 5: J,K,L 8: T,U,V 3: D,E,F 6: M,N,O 9:

USACO Section1.2 Milking Cows 解题报告

milk2解题报告 —— icedream61 博客园(转载请注明出处)------------------------------------------------------------------------------------------------------------------------------------------------[题目] N个农民,每个农民从L[i]到R[i]时间给奶牛挤奶.问最长的一直有人挤奶的时间,和最长的没有人挤奶的时间.[数据范围] 1<=N

USACO Section1.2 Palindromic Squares 解题报告

palsquare解题报告 —— icedream61 博客园(转载请注明出处)------------------------------------------------------------------------------------------------------------------------------------------------[题目] 把1~300中,其平方在B进制下是回文数的数进行输出.每个数x输出一行,输出B进制下的x和x²,用空格隔开. 注意,10~

USACO Section1.5 Number Triangles 解题报告

numtri解题报告 —— icedream61 博客园(转载请注明出处)------------------------------------------------------------------------------------------------------------------------------------------------[题目] 有一个数字的金字塔,形状如下    7   3 8  8 1 0 2 7 4 4 4 5 2 6 5 要从顶端开始走,每次只能向

USACO Section1.5 Superprime Rib 解题报告

sprime解题报告 —— icedream61 博客园(转载请注明出处)------------------------------------------------------------------------------------------------------------------------------------------------[题目] 列出所有N位的超级素数. 所谓超级素数,即指其任意位前缀均为素数.例如7.73.733.7331均为素数,故而7331为超级素数