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度的结果继续转,但别忘了如果原地转(在同一个矩阵中转,而不申请新的空间)是一定会错的-.-
------------------------------------------------------------------------------------------------------------------------------------------------
【代码】
/*
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 解题报告的更多相关文章
- USACO Section1.3 Wormholes 解题报告
wormhole解题报告 —— icedream61 博客园(转载请注明出处)------------------------------------------------------------- ...
- USACO Section 1.2 Transformations 解题报告
题目 题目描述 一块 N x N正方形的黑白瓦片的图案要被转换成新的正方形图案. 写一个程序来找出将原始图案按照以下列转换方法转换成新图案的最小方式: 转 90 度:图案按顺时针转 90 度. 转 1 ...
- USACO 1.3... 虫洞 解题报告(搜索+强大剪枝+模拟)
这题可真是又让我找到了八数码的感觉...哈哈. 首先,第一次见题,没有思路,第二次看题,感觉是搜索,就这样写下来了. 这题我几乎是一个点一个点改对的(至于为什么是这样,后面给你看一个神奇的东西),让我 ...
- USACO 1.4 ariprog 解题报告
这是继虫洞之后又让我为难的一个 剪枝题目,无论如何,做的再快,也只能过6个点,最后三个点也TLE.后来参考了一下标答,大概思路是这样的. 朴素算法就不多说了,枚举a,b然后判断就行,网上说这样优化到位 ...
- USACO Section1.5 Prime Palindromes 解题报告
pprime解题报告 —— icedream61 博客园(转载请注明出处)--------------------------------------------------------------- ...
- USACO Section1.4 Mother's Milk 解题报告
milk3解题报告 —— icedream61 博客园(转载请注明出处)---------------------------------------------------------------- ...
- USACO Section1.2 Name That Number 解题报告
namenum解题报告 —— icedream61 博客园(转载请注明出处)-------------------------------------------------------------- ...
- USACO Section1.1 Friday the Thirteenth 解题报告
friday解题报告 —— icedream61 博客园(转载请注明出处) -------------------------------------------------------------- ...
- USACO Section1.5 Superprime Rib 解题报告
sprime解题报告 —— icedream61 博客园(转载请注明出处)--------------------------------------------------------------- ...
随机推荐
- vscode:快速生成html的方法
第一步:在空文档中输入! 第二步:按下tab键. 以上
- ubuntu 显示隐藏文件
原文链接 http://blog.csdn.net/happyjiahan/article/details/6023496 方法1.使用命令ls -a显示所有的文件,包括隐藏文件 方法2.在桌面化操作 ...
- MySQL入门很简单: 3 操作数据库
登陆:mysq -u root -p 0409 1). 创建, 删除数据库 SHOW DATABASES; 显示已经存在的数据率 CREATE DATABASES 数据库名: 创建数据库 DROP D ...
- Thymeleaf模板引擎绕过浏览器缓存加载静态资源js,css文件
浏览器会缓存相同文件名的css样式表或者javascript文件.这给我们调试带来了障碍,好多时候修改的代码不能在浏览器正确显示. 静态常见的加载代码如下: <link rel="st ...
- 开发常用宏 - iOS
以下是一些开发中会经常用到的宏,简单的进行了整理,为了今后可以更加方便的使用,从而提升开发的效率,不为此搭进去更多时间. 也希望有大家可以补充,从而使其更加强加! /** * 开发常用宏相关 */ # ...
- 使用nsis开发自定义安装包使用心得,以及遇到坑
因为新公司需要开发pc应用的自定义安装包,开始时候计划使用nsis开发,论坛上面有很多不错的例子,而且完成度很强, 随便拿来修改使用,但是后续的开发过程中遇到的问题就逐个出现. 首先说一下nsis的优 ...
- jquery-ui-custom autocomplete
//jsp <%@ page language="java" import="java.util.*" pageEncoding="utf-8& ...
- BZOJ1901: Zju2112 Dynamic Rankings(整体二分 树状数组)
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 9094 Solved: 3808[Submit][Status][Discuss] Descript ...
- js中document的用法小结
document常用属性: document.title//设置文档标题,与HTNL中的title标签等价 document.bgColor//设置页面背景颜色 document.fgColor//设 ...
- spring-传统AOP
Spring传统AOP AOP的增强类型 AOP联盟定义了Advice(org.aopalliance.aop.Interface.Advice) 五类(目标类方法的连接点): 1. 前置通知(or ...