USACO Section 1.2 Transformations 解题报告
题目
题目描述
一块 N x N正方形的黑白瓦片的图案要被转换成新的正方形图案。
写一个程序来找出将原始图案按照以下列转换方法转换成新图案的最小方式:
- 转 90 度:图案按顺时针转 90 度.
- 转 180 度:图案按顺时针转 180 度.
- 转 270 度:图案按顺时针转 270 度.
- 翻转:图案在水平方向翻转(形成原图案的镜像).
- 组合:图案在水平方向翻转,然后按照1~3 之一转换.
- 不改变:原图案不改变.
- 无效转换:无法用以上方法得到新图案.
如果有多种可用的转换方法,请选择序号最小的那个。
数据范围
1 <= N <= 10
样例输入
3
@-@
---
@@-
@-@
@--
--@
样例输出
1
解题思路
这就是一个模拟,我们按照从小到达的序号依次枚举每一种操作,最后哪一种操作成功就输出哪种操作的序号。
关键是要细心,模块化编程,仔细处理好各种操作即可。
总结
在开始写代码的时候我遇到了一个以前没有考虑过的情况,那就是如何用函数返回一个二维字符数组,在百度了很久之后我找到了一种办法,就是下面的第一份解题代码,利用返回一个指向指针数组的指针来实现,这种方法写起来比较麻烦一点,但是程序的可读性还是不错的。
之后我看了官方标程,发现了一个更加巧妙的思路,那就是将图案保存在一个结构体中,我们每次操作直接返回一个结构体类型的变量,这样就避免了直接返回一个二维字符数组,并且这种写法可以使得程序更加的简短。这种思想我写在了下面的解题代码(Type 2)中。
解题代码
/*
ID: yinzong2
PROG: transform
LANG: C++11
*/
#define MARK
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
using namespace std;
const int maxn = 15;
int n;
char plat[maxn][maxn], finalPlat[maxn][maxn];
char **init() {
char **a;
a = new char*[n];
for(int i = 0; i < n; i++) {
a[i] = new char[n];
}
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
a[i][j] = plat[i][j];
}
}
return a;
}
char **rotate90(char **a, int row, int col) {
char **p;
p = new char*[row];
for(int i = 0; i < row; i++) {
p[i] = new char[col];
}
for(int i = 0; i < row; i++) {
for(int j = 0; j < col; j++) {
p[j][row-1-i] = a[i][j];
}
p[i][col] = '\0';
}
return p;
}
char **rotate180(char **a, int row, int col) {
char **p;
p = new char*[row];
for(int i = 0; i < row; i++) {
p[i] = new char[col];
}
p = rotate90(a, row, col);
p = rotate90(p, row, col);
return p;
}
char **rotate270(char **a, int row, int col) {
char **p;
p = new char*[row];
for(int i = 0; i < row; i++) {
p[i] = new char[col];
}
p = rotate180(a, row, col);
p = rotate90(p, row, col);
return p;
}
char **reflect(char **a, int row, int col) {
char **p;
p = new char*[row];
for(int i = 0; i < row; i++) {
p[i] = new char[col];
}
for(int i = 0; i < row; i++) {
for(int j = 0; j < col; j++) {
p[i][col-1-j] = a[i][j];
}
p[i][col] = '\0';
}
return p;
}
bool cmp(char **a) {
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
if(a[i][j] != finalPlat[i][j]) {
return false;
}
}
}
return true;
}
bool work(char **a, int row, int col) {
char **p;
p = new char*[row];
for(int i = 0; i < row; i++) {
p[i] = new char[col];
}
p = reflect(a, row, col);
if(cmp( rotate90(p, n, n) )) return true;
if(cmp( rotate180(p, n, n) )) return true;
if(cmp( rotate270(p, n, n) )) return true;
return false;
}
int main() {
#ifdef MARK
freopen("transform.in", "r", stdin);
freopen("transform.out", "w", stdout);
#endif // MARK
while(~scanf("%d", &n)) {
for(int i = 0; i < n; i++) {
scanf("%s", plat[i]);
}
for(int i = 0; i < n; i++) {
scanf("%s", finalPlat[i]);
}
char **a = init();
int ans;
if(cmp( rotate90(a, n, n) )) {
ans = 1;
} else if(cmp( rotate180(a, n, n) )) {
ans = 2;
} else if(cmp( rotate270(a, n, n) )) {
ans = 3;
} else if(cmp( reflect(a, n, n) )) {
ans = 4;
} else if(work(a, n, n)) {
ans = 5;
} else if(cmp(a)) {
ans = 6;
} else {
ans = 7;
}
printf("%d\n", ans);
delete(a);
}
return 0;
}
解题代码(Type 2)
/*
ID: yinzong2
PROG: transform
LANG: C++11
*/
#define MARK
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
const int maxn = 15;
int n;
struct Plat {
char p[maxn][maxn];
};
Plat plat, finalPlat;
Plat rotate90(Plat a) {
Plat np;
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
np.p[j][n-1-i] = a.p[i][j];
}
np.p[i][n] = '\0';
}
return np;
}
Plat reflect(Plat a) {
Plat np;
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
np.p[i][n-1-j] = a.p[i][j];
}
np.p[i][n] = '\0';
}
return np;
}
bool cmp(Plat a, Plat b) {
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
if(a.p[i][j] != b.p[i][j]) {
return false;
}
}
}
return true;
}
int main() {
#ifdef MARK
freopen("transform.in", "r", stdin);
freopen("transform.out", "w", stdout);
#endif // MARK
while(~scanf("%d", &n)) {
for(int i = 0; i < n; i++) {
scanf("%s", plat.p[i]);
}
for(int i = 0; i < n; i++) {
scanf("%s", finalPlat.p[i]);
}
int ans;
if(cmp(finalPlat, rotate90(plat))) {
ans = 1;
} else if(cmp(finalPlat, rotate90(rotate90(plat)))) {
ans = 2;
} else if(cmp(finalPlat, rotate90(rotate90(rotate90(plat))))) {
ans = 3;
} else if(cmp(finalPlat, reflect(plat))) {
ans = 4;
} else if(cmp(finalPlat, rotate90(reflect(plat)))
||cmp(finalPlat, rotate90(rotate90(reflect(plat))))
||cmp(finalPlat, rotate90(rotate90(rotate90(plat))))) {
ans = 5;
} else if(cmp(finalPlat, plat)) {
ans = 6;
} else {
ans = 7;
}
printf("%d\n", ans);
}
return 0;
}
USACO Section 1.2 Transformations 解题报告的更多相关文章
- USACO Section 1.3 Wormholes 解题报告
题目 题目描述 在一个二维平面上有N个点,这N个点是(N/2)个虫洞的端点,虫洞的特点就是,你以什么状态从某个端点进去,就一定会以什么状态从另一端的端点出来.现在有一头牛总是沿着与X轴正方向平行的直线 ...
- USACO Section1.2 Transformations 解题报告
transform解题报告 —— icedream61 博客园(转载请注明出处)------------------------------------------------------------ ...
- USACO Section2.2 Preface Numbering 解题报告 【icedream61】
preface解题报告----------------------------------------------------------------------------------------- ...
- USACO Section2.1 Hamming Codes 解题报告 【icedream61】
hamming解题报告----------------------------------------------------------------------------------------- ...
- USACO Section2.1 Healthy Holsteins 解题报告 【icedream61】
holstein解题报告 --------------------------------------------------------------------------------------- ...
- USACO Section2.1 The Castle 解题报告
castle解题报告 —— icedream61 博客园(转载请注明出处)--------------------------------------------------------------- ...
- USACO Section1.5 Prime Palindromes 解题报告
pprime解题报告 —— icedream61 博客园(转载请注明出处)--------------------------------------------------------------- ...
- USACO Section2.3 Controlling Companies 解题报告 【icedream61】
concom解题报告------------------------------------------------------------------------------------------ ...
- USACO Section2.3 Money Systems 解题报告 【icedream61】
money解题报告------------------------------------------------------------------------------------------- ...
随机推荐
- Bitcode问题
原因:Xcode7 及以上版本会默认开启 bitcode .bitcode具体是什么就不解释了.解决方法:1.更新library使包含Bitcode,否则会出现以上的警告.2.关闭Bitcode,简单 ...
- Word试卷文档模型化解析存储到数据库
最近在搞一套在线的考试系统,有许多人反映试题的新增比较麻烦(需要逐个输入),于是呼就整个了试卷批量导入了 poi实现word转html 模型化解析html html转Map数组 Map数组(数组的操作 ...
- JavaScript高级程序设计:第九章
第九章 一.使用能力检测 能力检测的目标不是识别特定的浏览器,而是识别浏览器的能力.能力检测的基本模式如下: if ( object.propertyInQuestion ) { //使用object ...
- rownum使用方法
rownum使用方法: .使用rownum子查询: rownum是一个总是从1开始的伪列,当查询条件rownum)时,不能从数据库查到记录,因此要 通过子查询解决:; 结果: SQL; R ID US ...
- Photoshop 字体
字体类型: 宋体系列:北宋年间 超粗宋.粗宋,大标宋.小标宋/中宋.宋体 黑体系列:建国初期 (当时写标语,识别度高) 超粗黑 大黑/黑体 中等线/细黑 --广告.画册.宣传册 非正规场合 文字工具( ...
- css(非表格变成表格用)
父元素:display:table: 子元素:display:table-cell:vertical-align:middle:
- WPF中静态引用资源与动态引用资源的区别
WPF中静态引用资源与动态引用资源的区别 WPF中引用资源分为静态引用与动态引用,两者的区别在哪里呢?我们通过一个小的例子来理解. 点击“Update”按钮,第2个按钮的文字会变成“更上一层楼”, ...
- Android OpenGL ES(五)GLSurfaceView .
Android OpenGL ES 相关的包主要定义在 javax.microedition.khronos.opengles GL 绘图指令 javax.microedition.khrono ...
- opencv----彩色图像对比度增强
图像对比度增强的方法可以分成两类:一类是直接对比度增强方法;另一类是间接对比度增强方法. 直方图拉伸和直方图均衡化是两种最常见的间接对比度增强方法. 直方图拉伸是通过对比度拉伸对直方图进行调整,从而“ ...
- LightOJ 1282 Leading and Trailing 数论
题目大意:求n^k的前三位数 和 后三位数. 题目思路:后三位数直接用快速幂取模就行了,前三位则有些小技巧: 对任意正数都有n=10^T(T可为小数),设T=x+y,则n=10^(x+y)=10^x* ...