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. 【Unique Binary Search Trees】cpp

    题目: Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For e ...

  2. Netsharp快速入门(之8) 基础档案(工作区2 设置商品主列表、规格细列表、商品表单、查询)

    作者:秋时 杨昶   时间:2014-02-15  转载须说明出处 3.5.1.1 列表设置 1.选择第一行主列表,点工具-列表方案 2.打开列表方案界面后,在列表项目填入需要用到实体Demo.Arc ...

  3. 【BZOJ】【2084】【POI2010】Antisymmetry

    Manacher算法 啊……Manacher修改一下就好啦~蛮水的…… Manacher原本是找首尾相同的子串,即回文串,我们这里是要找对应位置不同的“反回文串”(反对称?233) 长度为奇数的肯定不 ...

  4. matrix_last_acm_5

    password 123 A http://acm.hust.edu.cn/vjudge/contest/view.action?cid=97960#problem/A 题意:给国王生日可能区间[a, ...

  5. javascript版Ajax请求

    什么是Ajax请求,Ajax也就是“Asynchronous JavaScript and XML”(异步JavaScript和XML),无刷新数据读取.能减少流量的消耗,也提高了浏览的流畅性,给用户 ...

  6. Altium Designer 使用小结

    今天刚把做好的PCB文件交给工厂去制板,阶段工作告一段落,来一个小总结. 前一段时间复习完C语言之后,在中国知网上搜索用单片机实现的小制作,找比较有意思,又不需要太多外专业知识的东西,然后就相中了超声 ...

  7. IE6/7/8如何兼容CSS3属性

    最近在工作中总是要求IE8兼容CSS3属性,在网上搜了搜主要是引入了一个htc文件(ie-css3.htc或者PIE.htc.个人认为这两个文件的作用差不多,具体差异值得探讨) 下载地址:https: ...

  8. BZOJ 1029 [JSOI2007] 建筑抢修(贪心)

    1029: [JSOI2007]建筑抢修 Time Limit: 4 Sec  Memory Limit: 162 MBSubmit: 2285  Solved: 1004[Submit][Statu ...

  9. ajax原理总结附简单实例及其优点

    在工作中用了Ajax N多次了,也看过一些相关方面的书籍,也算是认识了它,但是一直没有认真总结和整理过相关的东东,失败! 近有闲情,将之总结如下: [名称] Ajax是Asynchronous Jav ...

  10. 集合类 Collection

    1.Collection接口有两个子接口: List:保存元素顺序的线性表,允许有重复元素. Set:不记录元素的保存顺序,不允许有重复元素.数学中的集合 Collection接口中的方法如下: Co ...