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度的结果继续转,但别忘了如果原地转(在同一个矩阵中转,而不申请新的空间)是一定会错的-.-

------------------------------------------------------------------------------------------------------------------------------------------------

【代码】

 /*
ID: icedrea1
PROB: transform
LANG: C++
*/ #include <iostream>
#include <fstream>
using namespace std; int N;
typedef char Map[+][+];
Map A,B; void PP(Map x)
{
for(int i=;i!=N;++i)
{
for(int j=;j!=N;++j) cout<<x[i][j];
cout<<endl;
}
cout<<"------------------------------------"<<endl;
}
void get(Map x,Map y)
{
for(int i=;i!=N;++i)
for(int j=;j!=N;++j) x[i][j]=y[i][j];
}
bool same(Map x,Map y)
{
for(int i=;i!=N;++i)
for(int j=;j!=N;++j)
if(x[i][j]!=y[i][j]) return false;
return true;
}
int work()
{
Map t,k; PP(A); PP(B); // #1 (i,j)=(N-1-j,i)
get(k,A);
for(int i=;i!=N;++i)
for(int j=;j!=N;++j) t[i][j]=k[N--j][i];
PP(t);
if(same(t,B)) return ; // #2 #1×2
get(k,t);
for(int i=;i!=N;++i)
for(int j=;j!=N;++j) t[i][j]=k[N--j][i];
PP(t);
if(same(t,B)) return ; // #3 #1×3
get(k,t);
for(int i=;i!=N;++i)
for(int j=;j!=N;++j) t[i][j]=k[N--j][i];
if(same(t,B)) return ; // #4 (i,j)=(i,N-1-j)
get(k,A);
for(int i=;i!=N;++i)
for(int j=;j!=N;++j) t[i][j]=k[i][N--j];
if(same(t,B)) return ; // #5 #4 + #1~3
get(k,t);
for(int i=;i!=N;++i)
for(int j=;j!=N;++j) t[i][j]=k[N--j][i];
if(same(t,B)) return ;
get(k,t);
for(int i=;i!=N;++i)
for(int j=;j!=N;++j) t[i][j]=k[N--j][i];
if(same(t,B)) return ;
get(k,t);
for(int i=;i!=N;++i)
for(int j=;j!=N;++j) t[i][j]=k[N--j][i];
if(same(t,B)) return ; // #6 no change
if(same(A,B)) return ; // #7 impossible
return ;
} int main()
{
ifstream in("transform.in");
ofstream out("transform.out"); in>>N; in.get();
for(int i=;i!=N;++i)
{
for(int j=;j!=N;++j) A[i][j]=in.get();
in.get();
}
for(int i=;i!=N;++i)
{
for(int j=;j!=N;++j) B[i][j]=in.get();
in.get();
} out<<work()<<endl; in.close();
out.close();
return ;
}

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

  1. USACO Section1.3 Wormholes 解题报告

    wormhole解题报告 —— icedream61 博客园(转载请注明出处)------------------------------------------------------------- ...

  2. USACO Section 1.2 Transformations 解题报告

    题目 题目描述 一块 N x N正方形的黑白瓦片的图案要被转换成新的正方形图案. 写一个程序来找出将原始图案按照以下列转换方法转换成新图案的最小方式: 转 90 度:图案按顺时针转 90 度. 转 1 ...

  3. USACO 1.3... 虫洞 解题报告(搜索+强大剪枝+模拟)

    这题可真是又让我找到了八数码的感觉...哈哈. 首先,第一次见题,没有思路,第二次看题,感觉是搜索,就这样写下来了. 这题我几乎是一个点一个点改对的(至于为什么是这样,后面给你看一个神奇的东西),让我 ...

  4. USACO 1.4 ariprog 解题报告

    这是继虫洞之后又让我为难的一个 剪枝题目,无论如何,做的再快,也只能过6个点,最后三个点也TLE.后来参考了一下标答,大概思路是这样的. 朴素算法就不多说了,枚举a,b然后判断就行,网上说这样优化到位 ...

  5. USACO Section1.5 Prime Palindromes 解题报告

    pprime解题报告 —— icedream61 博客园(转载请注明出处)--------------------------------------------------------------- ...

  6. USACO Section1.4 Mother's Milk 解题报告

    milk3解题报告 —— icedream61 博客园(转载请注明出处)---------------------------------------------------------------- ...

  7. USACO Section1.2 Name That Number 解题报告

    namenum解题报告 —— icedream61 博客园(转载请注明出处)-------------------------------------------------------------- ...

  8. USACO Section1.1 Friday the Thirteenth 解题报告

    friday解题报告 —— icedream61 博客园(转载请注明出处) -------------------------------------------------------------- ...

  9. USACO Section1.5 Superprime Rib 解题报告

    sprime解题报告 —— icedream61 博客园(转载请注明出处)--------------------------------------------------------------- ...

随机推荐

  1. 前端必须要掌握的几个CSS3的属性

    随着Css3和html5的风靡,越来越多的前端人员开始学习Css3,今天的文章就是来说说前端应该掌握10个Css3属性. 1. Border-radius Border-radius是一大堆CSS3属 ...

  2. HashMap通过hashcode对其内容进行快速查找,而 TreeMap中所有的元素都保持着某种固定的顺序

    HashMap通过hashcode对其内容进行快速查找,而 TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不 ...

  3. ABI and compiler

    http://stackoverflow.com/questions/2171177/what-is-application-binary-interface-abi ABIs cover detai ...

  4. openwrt定制管理

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/qianguozheng/article/details/24673097 近期这个比較火,可是改了东 ...

  5. eclips新建Maven Web项目

    一.创建项目 1.Eclipse中用Maven创建项目 上图中Next 2.继续Next 3.选maven-archetype-webapp后,next 4.填写相应的信息,Packaged是默认创建 ...

  6. when 让你跳出异步回调噩梦 node.js下promise/A规范的使用

    其实关于promise 的博客,前端时间专门写了一篇关于 promise 规范的文章,promise规范 让 javascript 中的异步调用更加人性化. 简单回忆下: promise/A规范定义的 ...

  7. Kubernetes解决了Docker使用中的哪些问题?

    kubernetes是谷歌开源的容器集群管理系统,是Google多年大规模容器管理技术Borg的开源版本 (1)基于容器的应用部署.维护和滚动升级 (2)网络,建立容器之间的通信子网如隧道.路由等,解 ...

  8. Responsive设计 (响应式设计)

    一.什么是响应式设计 维基百科是这样对响应式作的描述:“Responsive设计简单的称为RWD,是精心提供各种设备都能浏览网页的一种设计方法,RWD能让你的网页在不同的设备中展现不同的设计风格.” ...

  9. Qlikview 数据加载方法罗列

    以下是通常会用到的数据加载的方法,供大家参考: 1. 从文件加载: Data: Load *,RowNo() as InputKey; SQL SELECT ID,TEST,DATECREATED F ...

  10. Visual Studio Code快捷键_Linux

    Keyboard shortcuts for Linux Basic editing Ctrl + X Cut line(empty selection) Ctrk + C   Copy line(e ...