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 博客园(转载请注明出处)--------------------------------------------------------------- ...
随机推荐
- 模拟停车POJ(3505)
题目链接:http://poj.org/problem?id=3505 解题报告: #include <stdio.h> #include <iostream> #includ ...
- 20145238-荆玉茗 《Java程序设计》第8周学习总结
20145238 <Java程序设计>第8周学习总结 教材学习内容总结 第15章 通用API 15.1.1 ·java.util.logging包提供了日志功能相关类与接口,使用日志的起点 ...
- 数据对齐 posix_memalign 函数详解
对齐 数 据的对齐(alignment)是指数据的地址和由硬件条件决定的内存块大小之间的关系.一个变量的地址是它大小的倍数的时候,这就叫做自然对齐 (naturally aligned).例如,对于一 ...
- rabbitmq安装使用
使用 http://www.open-open.com/lib/view/open1325131828249.html ubuntu:apt-get install erlang-noxsudo ap ...
- data-ng-hide指令用于隐藏或显示HTML元素
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- 阅读list
最近感觉效率不高,其实有很多事情要做的,读书的速度也慢下来了,要抓紧时间的了. 继续读deep learning 一书的part II. 读完jifeng dai的几篇文章,去年欠下的债务啊.其中包括 ...
- Login用户登录(Python实现)
username_fault = "isuperSun" #程序存储用户名和密码 password_fault = " counts = 0 while counts&l ...
- 前端JavaScript之BOM
BOM:浏览器对象模型,操作浏览器部分功能的API.比如让浏览器自动滚动. 1.window对象 所有浏览器都支持 window 对象.概念上讲.一个html文档对应一个window对象.功能上讲: ...
- 微信小程序日期选择器
/* JS代码部分 */ const date = new Date() const years = [] const months = [] const days = [] const hours ...
- C#+Winform记事本程序
第17章 记事本 如何使用Visual C# 2010设计一个Windows应用程序——记事本,学习,可以进一步掌握MenuStrip(菜单).ToolStrip(工具栏).RichTextBox(高 ...