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 博客园(转载请注明出处)--------------------------------------------------------------- ...
随机推荐
- 【js基础修炼之路】— 深入浅出理解闭包
之前对于闭包的理解只是很肤浅的,只是浮于表面,这次深究了一下闭包,下面是我对闭包的理解. 什么是闭包? 引用高程里的话 => 闭包就是有权访问另一个作用域中变量的函数,闭包是由函数以及创建该函数 ...
- python 网址
https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431752945034e ...
- COGS2287 [HZOI 2015]疯狂的机器人
[题目描述] 现在在二维平面内原点上有一只机器人 他每次操作可以选择向右走,向左走,向下走,向上走和不走(每次如果走只能走一格) 但是由于本蒟蒻施展的大魔法,机器人不能走到横坐标是负数或者纵坐标是负数 ...
- 【转】android中的Style与Theme
Android默认情况下提供了一些实用的主题样式,比如说Theme.Dialog可以让你的Activity变成一个窗口风格,而Theme.Light则让你的整个Activity具有白色的背景,而不是黑 ...
- Windows 7下的ARP
关于Windows 7和Windows XP下的ARP绑定的不同之处网络上已经很多,没空就不多说,注意用这样的方式绑定的arp项是动态的,动态的意思就是这个项不受任何保护,Windows想什么时候更改 ...
- 基于指令的移植方式的几个重要概念的理解(OpenHMPP, OpenACC)-转载
引言: 什么是基于指令的移植方式呢?首先我这里说的移植可以理解为把原先在CPU上跑的程序放到像GPU一样的协处理器上跑的这个过程.在英文里可以叫Porting.移植有两种方式:一种是使用CUDA或者O ...
- C# 命名空间与语句
C#采用命名空间(namespace)来组织程序.命名空间可以嵌套.using指示符可以用来简化命名空间类型的引用.using指示符有两种用法."using System;"语句可 ...
- 前端css样式及选择器
标题: 1.scc概述 2.行内样式 3.内接样式 4.外接样式(链接式) 推荐使用 5.外接样式(导入式) 6.嵌套规则 7.css选择器 1.scc(Cascading Style Shee ...
- v-for的简单实现
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- centos6 下查看SELinux状态 关闭SELinux
转载自:https://blog.csdn.net/boomjane_testingblog/article/details/52859977 SELinux(Security-Enhanced Li ...