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 博客园(转载请注明出处)--------------------------------------------------------------- ...
随机推荐
- oracle 11g expdp impdp详细使用方法
11G中有个新特性,当表无数据时,不分配segment,以节省空间 解决方法如下图: 二.oracle10g以后提供了expdp/impdp工具,同样可以解决此问题 1.导出expdp工具使用方法: ...
- EF分组后把查询的字段具体映射到指定类里面的写法
//先做基本查询 var querySql = from l in _logClinicDataOperationRepository.Table select new LogClinicDataOp ...
- BestCoder Round #89 1002 Fxx and game
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5945 分析: 很容易想到用bfs,然而会超时,几乎是O(xt)了 这里用单调队列优化, 首先反着来,f ...
- lintcode 77.Longest Common Subsequence(最长公共子序列)、79. Longest Common Substring(最长公共子串)
Longest Common Subsequence最长公共子序列: 每个dp位置表示的是第i.j个字母的最长公共子序列 class Solution { public: int findLength ...
- Spring 远程调用工具类RestTemplateUtils
Spring 远程调用Rest服务工具类,包含Get.Post.Put.Delete四种调用方式. 依赖jar <dependency> <groupId>org.spring ...
- P1823 Patrik 音乐会的等待
题目描述 N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟进行谈笑风生.队列中任意两个人A和B,如果他们是相邻或他们之间没有人比A或B高,那么他们是可以互相看 ...
- mayan 游戏真是毒瘤
如题 真坑呀!!! 可算过了 我率先达到了氧气富有化 先是改变时没有fall.40分 然后是fall函数写慢了 tle 50分 . 上代码 #include<cstdio> #includ ...
- Miller rabin
蛤蛤,终于基本上搞懂了 #include<iostream> #include<cstdio> using namespace std; long long num[10]={ ...
- 【P1330】 封锁阳光大学
两个和谐河蟹不能在同一条边的两端.所以对于每条边.只有一个节点有和谐河蟹 所以说,我们可以将有和谐河蟹的看做一种颜色,或则是状态.没有河蟹看做另一种言颜色 这样边变成了二分图染色 所以嗯~(・∀・) ...
- Git笔记(pull/push)
一.从远程服务器上获取分支 git pull <远程主机名> <远程分支>:<本地分支> 例如 git pull origin master:loacal_bran ...