题目

题目描述

一块 N x N正方形的黑白瓦片的图案要被转换成新的正方形图案。

写一个程序来找出将原始图案按照以下列转换方法转换成新图案的最小方式:

  1. 转 90 度:图案按顺时针转 90 度.
  2. 转 180 度:图案按顺时针转 180 度.
  3. 转 270 度:图案按顺时针转 270 度.
  4. 翻转:图案在水平方向翻转(形成原图案的镜像).
  5. 组合:图案在水平方向翻转,然后按照1~3 之一转换.
  6. 不改变:原图案不改变.
  7. 无效转换:无法用以上方法得到新图案.

如果有多种可用的转换方法,请选择序号最小的那个。

数据范围

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 解题报告的更多相关文章

  1. USACO Section 1.3 Wormholes 解题报告

    题目 题目描述 在一个二维平面上有N个点,这N个点是(N/2)个虫洞的端点,虫洞的特点就是,你以什么状态从某个端点进去,就一定会以什么状态从另一端的端点出来.现在有一头牛总是沿着与X轴正方向平行的直线 ...

  2. USACO Section1.2 Transformations 解题报告

    transform解题报告 —— icedream61 博客园(转载请注明出处)------------------------------------------------------------ ...

  3. USACO Section2.2 Preface Numbering 解题报告 【icedream61】

    preface解题报告----------------------------------------------------------------------------------------- ...

  4. USACO Section2.1 Hamming Codes 解题报告 【icedream61】

    hamming解题报告----------------------------------------------------------------------------------------- ...

  5. USACO Section2.1 Healthy Holsteins 解题报告 【icedream61】

    holstein解题报告 --------------------------------------------------------------------------------------- ...

  6. USACO Section2.1 The Castle 解题报告

    castle解题报告 —— icedream61 博客园(转载请注明出处)--------------------------------------------------------------- ...

  7. USACO Section1.5 Prime Palindromes 解题报告

    pprime解题报告 —— icedream61 博客园(转载请注明出处)--------------------------------------------------------------- ...

  8. USACO Section2.3 Controlling Companies 解题报告 【icedream61】

    concom解题报告------------------------------------------------------------------------------------------ ...

  9. USACO Section2.3 Money Systems 解题报告 【icedream61】

    money解题报告------------------------------------------------------------------------------------------- ...

随机推荐

  1. 第十三节,基本数据类型,数字int字符串str

    基本数据类型 数字 int 字符串 str 布尔值 bool 列表 list 元组 tuple 字典 dict 数据类型关系图 查看一个对象的类 如:如查看对象变量a是什么类          用到函 ...

  2. Java-if 嵌套结构

    import java.util.Scanner; public class ifs{ public static void main(String args[]){ Scanner in=new S ...

  3. bg-render+bg-class+filter

    重点: 1.多层render写法参数下面的html代码段,外层bg-render---><script type='text/html'>--->{{for}}--->b ...

  4. 使用SQLCMD在SQLServer执行多个脚本 转载

    出处不明 概述: 作为DBA,经常要用开发人员提供的SQL脚本来更新正式数据库,但是一个比较合理的开发流程,当提交脚本给DBA执行的时候,可能已经有几百个sql文件,并且有执行顺序,如我现在工作的公司 ...

  5. HTML与DOM BOM javascript

    1.什么是DOM? 简单说就是DOM规定了HTML,XML等的一些文档映射规范,使JavaScript可以根据这些规范来进行获取元素,在元素上进行各种操作,使得用户页面可以动态的变化,从而大大使页面的 ...

  6. 漫谈QML

    漫谈 QML/Qt Quick QML是从Qt 4.7开始引入的,QML是一种声明语言,使得可以像设计师思考的一样编码,并且Qt Quick元素就是应用程序的编译单元,每一帧的故事板被声明为元素树中的 ...

  7. Unable to chmod /system/build.prop.: Read-only file system

    Unable to chmod /system/build.prop.: Read-only file system 只读文件系统 所以需要更改 使用下面的命令 mount -o remount,rw ...

  8. php fsockopen

    1.PHP fsockopen函数说明: Open Internet or Unix domain socket connection(打开套接字链接) Initiates a socket conn ...

  9. UIImagePickerController 相关

    UIImagePickerController是系统封装好的一个导航视图控制器,使用其开发者可以十分方便的进行相机相册相关功能的调用.UIImagePickerController继承于UINavig ...

  10. [转]View属性 之 paddingStart & paddingEnd

    [CAUSE] 在写一个自定义View时, 直接复制了Android-Source的XML布局文件, 默认开发SDK版本是4.2.2(Level-API-17), 后因其他原因将SDK版本改为4.1. ...