zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    2019安徽省程序设计竞赛 I.你的名字(序列自动机)
    poj3522Slim Span(暴力+Kruskal)
    Uva1349Optimal Bus Route Design(二分图最佳完美匹配)(最小值)
    基于Python的Web应用开发实战——3 Web表单
    [nRF51822]5.触摸按键
    [nRF51822]4.GPIO控制蜂鸣器
    [nRF51822]3. GPIO输入按键检测
    [nRF51822]2. 跑马灯
    [nRF51822]1. 点亮一个LED
    [nRF51822]0.nRF51822的开发环境
  • 原文地址:https://www.cnblogs.com/icedream61/p/4321413.html
Copyright © 2011-2022 走看看