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. TP5.1:模板继承(重要知识点)

    1.在app\index\controller文件夹新建一个名为Lyot(自定义)的控制器,在控制器中定义: 2.创建一个被继承的public(自定义)文件夹,里面有三个文件,分别是header.ht ...

  2. 安装国际版firefox(火狐浏览器)并设置语言为中文

    访问https://www.mozilla.org/zh-CN/firefox/new/?scene=2下载.安装: 访问https://addons.mozilla.org/zh-CN/firefo ...

  3. linux系统管理命令kata练习

    磁盘管理 #打印当前目录下,各个文件大小和目录的磁盘空间占用情况. #获取硬盘被占用了多少空间,目前还剩下多少空间等信息 df -lh #查看管理磁盘分区 fdisk -l #制作文件系统 mkfs ...

  4. hdu-1892 See you~---二维树状数组运用

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1892 题目大意: 题目大意:有很多方格,每个方格对应的坐标为(I,J),刚开始时每个格子里有1本书, ...

  5. Codeforces 758D Ability To Convert(区间DP)

    题目链接:http://codeforces.com/problemset/problem/758/D 题意:一个n进制下的数k,其中k不会用字母,如果有A就用10代替了.求k这个数对应的,在10进制 ...

  6. python非字符串与字符产链连接

    第一种办法: "hello" +' '+str(110) 输出结果: 'hello 110' 第二种办法: import numpy x = 110 print 'hello(%d ...

  7. 如何在linux服务器部署Rstudio server,配置ODBC远程访问win 服务器上的SQL server

    如何在linux服务器部署Rstudio server,配置ODBC后通过RODBC包远程访问SQL server 背景介绍:之前写过一篇文章,提到近期要部署Rstudio server(搭建数据分析 ...

  8. 注解@Component,@Controller,@Service,@Repository简单了解

    Spring 自 2.0 版本开始,陆续引入了一些注解用于简化 Spring 的开发.@Repository注解便属于最先引入的一批,它用于将数据访问层 (DAO 层 ) 的类标识为 Spring B ...

  9. 泛型&&枚举

    1.枚举类型 JDk1.5中新增了枚举类型,可以使用该功能取代以往定义常量的方式,同时枚举类型还赋予程序在编译时进行检查的功能. 1.1 使用枚举类型设置常量 以往设置常量,通常将常量放在接口中(fi ...

  10. 太阳地球月亮运行动画(使用@keyframes)

    闲来无事的demo <!DOCTYPE html> <html> <head> <meta charset="utf-8"> < ...