A square pattern of size N x N (1 <= N <= 10) black and white square tiles is transformed into another square pattern. Write a program that will recognize the minimum transformation that has been applied to the original pattern given the following list of possible transformations:

  • #1: 90 Degree Rotation: The pattern was rotated clockwise 90 degrees.
  • #2: 180 Degree Rotation: The pattern was rotated clockwise 180 degrees.
  • #3: 270 Degree Rotation: The pattern was rotated clockwise 270 degrees.
  • #4: Reflection: The pattern was reflected horizontally (turned into a mirror image of itself by reflecting around a vertical line in the middle of the image).
  • #5: Combination: The pattern was reflected horizontally and then subjected to one of the rotations (#1-#3).
  • #6: No Change: The original pattern was not changed.
  • #7: Invalid Transformation: The new pattern was not obtained by any of the above methods.

In the case that more than one transform could have been used, choose the one with the minimum number above.

PROGRAM NAME: transform

INPUT FORMAT

Line 1: A single integer, N
Line 2..N+1: N lines of N characters (each either `@' or `-'); this is the square before transformation
Line N+2..2*N+1: N lines of N characters (each either `@' or `-'); this is the square after transformation

SAMPLE INPUT (file transform.in)

3
@-@
---
@@-
@-@
@--
--@

OUTPUT FORMAT

A single line containing the the number from 1 through 7 (described above) that categorizes the transformation required to change from the `before' representation to the `after' representation.

SAMPLE OUTPUT (file transform.out)

1

一A的题,好happy。
不难,就是很麻烦。我是把前四个操作写成四个函数。其中旋转90度作为基本的函数,旋转180和旋转270都是由两次和三次旋转90度得到。
主要的问题就是int**和int a[][11]这两种传递参数时候遇到的麻烦,不知道怎么把两者统一起来,所以每次都要先把int**复制到一个数组里面,再作为参数传递给下一个函数,下午去找找资料吧。
 /*ID:Moment1991
PROG:transform
LANG:C++
Compiling...
Compile: OK Executing...
Test 1: TEST OK [0.000 secs, 3496 KB]
Test 2: TEST OK [0.003 secs, 3496 KB]
Test 3: TEST OK [0.008 secs, 3496 KB]
Test 4: TEST OK [0.008 secs, 3496 KB]
Test 5: TEST OK [0.005 secs, 3496 KB]
Test 6: TEST OK [0.003 secs, 3496 KB]
Test 7: TEST OK [0.005 secs, 3496 KB]
Test 8: TEST OK [0.005 secs, 3496 KB] All tests OK.
*/
#include <iostream>
#include <fstream>
#include <stdlib.h>
using namespace std; //旋转90度的操作
int **transiformation_one(int before[][],int n){
int **tran = new int*[];
for(int i = ;i < ;i++){
tran[i] = new int[];
}
for(int i = ;i < n;i++)
for(int j = ;j < n;j ++){
tran[j][n-i-] = before[i][j];
}
return tran;
} //旋转180由两次旋转90度得到
int **transiformation_two(int before[][],int n){
int **tran_1 = transiformation_one(before,n);
int temp[][];
for(int i = ;i < n;i++)
for(int j = ;j < n;j ++)
temp[i][j] = tran_1[i][j];
int **tran_2 = transiformation_one(temp,n);
return tran_2;
} //旋转270由三次旋转90度得到
int **transiformation_three(int before[][],int n){
int **tran_1 = transiformation_one(before,n);
int temp[][];
for(int i = ;i < n;i++)
for(int j = ;j < n;j ++)
temp[i][j] = tran_1[i][j]; int **tran_2 = transiformation_one(temp,n);
for(int i = ;i < n;i++)
for(int j = ;j < n;j ++)
temp[i][j] = tran_2[i][j]; int **tran_3 = transiformation_one(temp,n);
return tran_3;
} //沿竖直方向翻转
int **transiformation_four(int before[][],int n){
int **tran = new int*[];
for(int i = ;i < ;i++){
tran[i] = new int[];
} for(int j = ;j <= n/;j++){
for(int i = ;i < n;i ++){
tran[i][n-j-] = before[i][j];
tran[i][j] = before[i][n-j-];
}
}
return tran;
} //判断两个矩阵是否相等
bool is_equal(int **tran,int after[][],int n){
for(int i = ;i < n;i ++)
for(int j = ;j < n;j ++)
if(tran[i][j] != after[i][j]){
return false;
}
return true;
} //没办法统一int**和inta[][11],只好写两个判断相等函数
bool another_equal(int tran[][],int after[][],int n){
for(int i = ;i < n;i ++)
for(int j = ;j < n;j ++)
if(tran[i][j] != after[i][j])
return false;
return true;
} int main(){
ifstream cin("transform.in");
ofstream cout("transform.out"); int n;
char a;
int before[][];
int after[][]; cin >> n;
for(int i = ;i < n;i++)
for(int j = ;j < n;j++){
cin >> a;
if(a == '@')
before[i][j] = ;
else
before[i][j] = ;
} for(int i = ;i < n;i++)
for(int j = ;j < n;j++)
{
cin >> a;
if(a == '@')
after[i][j] = ;
else
after[i][j] = ;
} int **tran = transiformation_one(before,n);
if(is_equal(tran,after,n))
{
cout <<<<endl;
free(tran);
return ;
} tran = transiformation_two(before,n);
if(is_equal(tran,after,n))
{
cout <<<<endl;
free(tran);
return ;
} tran = transiformation_three(before,n);
if(is_equal(tran,after,n))
{
cout <<<<endl;
free(tran);
return ;
} tran = transiformation_four(before,n);
if(is_equal(tran,after,n))
{
cout <<<<endl;
free(tran);
return ;
} //组合操作,调用多个函数实现
tran = transiformation_four(before,n); int temp[][];
for(int i = ;i < n;i++)
for(int j = ;j < n;j ++)
temp[i][j] = tran[i][j];
int **tran_2 = transiformation_one(temp,n); if(is_equal(tran_2,after,n))
{
cout <<<<endl;
free(tran);
free(tran_2);
return ;
}
else{
tran_2 = transiformation_two(temp,n);
if(is_equal(tran_2,after,n))
{
cout <<<<endl;
free(tran);
free(tran_2);
return ;
}
}
tran_2 = transiformation_three(temp,n);
if(is_equal(tran_2,after,n))
{
cout <<<<endl;
free(tran);
free(tran_2);
return ;
} if(another_equal(before,after,n))
{
cout << <<endl;
return ;
} cout <<<<endl;
return ; }

【USACO】Transformations的更多相关文章

  1. 【USACO】Transformations(模拟)

    Transformations A square pattern of size N x N (1 <= N <= 10) black and white square tiles is ...

  2. POJ 1986 Distance Queries / UESTC 256 Distance Queries / CJOJ 1129 【USACO】距离咨询(最近公共祖先)

    POJ 1986 Distance Queries / UESTC 256 Distance Queries / CJOJ 1129 [USACO]距离咨询(最近公共祖先) Description F ...

  3. 1642: 【USACO】Payback(还债)

    1642: [USACO]Payback(还债) 时间限制: 1 Sec 内存限制: 64 MB 提交: 190 解决: 95 [提交] [状态] [讨论版] [命题人:外部导入] 题目描述 &quo ...

  4. 1519: 【USACO】超级书架

    1519: [USACO]超级书架 时间限制: 1 Sec 内存限制: 64 MB 提交: 1735 解决: 891 [提交] [状态] [讨论版] [命题人:外部导入] 题目描述 Farmer Jo ...

  5. Java实现【USACO】1.1.2 贪婪的礼物送礼者 Greedy Gift Givers

    [USACO]1.1.2 贪婪的礼物送礼者 Greedy Gift Givers 题目描述 对于一群要互送礼物的朋友,你要确定每个人送出的礼物比收到的多多少(and vice versa for th ...

  6. 【CPLUSOJ】【USACO】【差分约束】排队(layout)

    [题目描述] Robin喜欢将他的奶牛们排成一队.假设他有N头奶牛,编号为1至N.这些奶牛按照编号大小排列,并且由于它们都很想早点吃饭,于是就很可能出现多头奶牛挤在同一位置的情况(也就是说,如果我们认 ...

  7. 【USACO】Dining

    [题目链接] [JZXX]点击打开链接 [caioj]点击打开链接 [算法] 拆点+网络流 [代码] #include<bits/stdc++.h> using namespace std ...

  8. 【USACO】Optimal Milking

    题目链接 :        [POJ]点击打开链接        [caioj]点击打开链接 算法 : 1:跑一遍弗洛伊德,求出点与点之间的最短路径 2:二分答案,二分”最大值最小“ 3.1:建边,将 ...

  9. 【USACO】 Balanced Photo

    [题目链接] 点击打开链接 [算法] 树状数组 [代码] #include<bits/stdc++.h> using namespace std; int i,N,ans,l1,l2; ] ...

随机推荐

  1. 心情符号love

    写点什么呢,先谢谢心情吧,算是第一个脚印了,想先把之前的一些笔记和心得迁移进来吧,以后每个月都要充实自己的知识.向大婶们看齐.走你们走过的脚印,看你们前行的身影.沿着你们留下的路,继续为后者拓宽道路. ...

  2. Poj 1904 King's Quest 强连通分量

    题目链接: http://poj.org/problem?id=1904 题意: 有n个王子和n个公主,王子只能娶自己心仪的公主(一个王子可能会有多个心仪的公主),现已给出一个完美匹配,问每个王子都可 ...

  3. short-path problem (Dijkstra) 分类: ACM TYPE 2014-09-01 23:51 111人阅读 评论(0) 收藏

    #include <cstdio> #include <iostream> #include <cstring> using namespace std; cons ...

  4. java 解决JFrame不能设置背景色的问题 分类: Java Game 2014-08-15 09:48 119人阅读 评论(0) 收藏

    这段时间比较多,于是写一写JAVA的一些IT技术文章.如有JAVA高手请加QQ:314783246,互相讨论. 在Java的GUI设计中,Frame和JFrame两者之间有很大差别,上次刚学时编一个窗 ...

  5. c++ 遍历ini

    inline void CDLG_SET1::EnumIniFile(LPCTSTR pFilePath, CString strKey) { TCHAR strAppNameTemp[];//所有A ...

  6. DevOps:怎么实现源代码注释和系统文档的自动化更新?

    [编者按]计算机软件传统定义为:软件是计算机系统中与硬件相依存的另一部分,软件包括程序.数据及其相关文档的完整集合.然而在时下的开发中,文档的合规性往往被忽视的干干净净.本文由 Todd Waits ...

  7. ios下最简单的正则,RegexKitLite

    ios下最简单的正则,RegexKitLite 1.去RegexKitLite下载类库,解压出来会有一个例子包及2个文件,其实用到的就这2个文件,添加到工程中.备用地址:http://www.coco ...

  8. HDU 1026 Ignatius and the Princess I (BFS)

    题目链接 题意 : 从(0,0)点走到(N-1,M-1)点,问最少时间. 思路 : BFS..... #include <stdio.h> #include <string.h> ...

  9. DB2 DATE类型在显示的时候,带有00:00:00,去掉的方法,使用VARCHAR()函数

    DROP VIEW DMS.V_AQ_INSURANCECLAIMS; CREATE VIEW DMS.V_AQ_INSURANCECLAIMS AS SELECT * FROM (SELECT T1 ...

  10. C#中String跟string的“区别”

    string是c#中的类,String是.net Framework的类(在C# IDE中不会显示蓝色) C# string映射为.net Framework的String 如果用string,编译器 ...