【USACO】Transformations
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的更多相关文章
- 【USACO】Transformations(模拟)
Transformations A square pattern of size N x N (1 <= N <= 10) black and white square tiles is ...
- POJ 1986 Distance Queries / UESTC 256 Distance Queries / CJOJ 1129 【USACO】距离咨询(最近公共祖先)
POJ 1986 Distance Queries / UESTC 256 Distance Queries / CJOJ 1129 [USACO]距离咨询(最近公共祖先) Description F ...
- 1642: 【USACO】Payback(还债)
1642: [USACO]Payback(还债) 时间限制: 1 Sec 内存限制: 64 MB 提交: 190 解决: 95 [提交] [状态] [讨论版] [命题人:外部导入] 题目描述 &quo ...
- 1519: 【USACO】超级书架
1519: [USACO]超级书架 时间限制: 1 Sec 内存限制: 64 MB 提交: 1735 解决: 891 [提交] [状态] [讨论版] [命题人:外部导入] 题目描述 Farmer Jo ...
- Java实现【USACO】1.1.2 贪婪的礼物送礼者 Greedy Gift Givers
[USACO]1.1.2 贪婪的礼物送礼者 Greedy Gift Givers 题目描述 对于一群要互送礼物的朋友,你要确定每个人送出的礼物比收到的多多少(and vice versa for th ...
- 【CPLUSOJ】【USACO】【差分约束】排队(layout)
[题目描述] Robin喜欢将他的奶牛们排成一队.假设他有N头奶牛,编号为1至N.这些奶牛按照编号大小排列,并且由于它们都很想早点吃饭,于是就很可能出现多头奶牛挤在同一位置的情况(也就是说,如果我们认 ...
- 【USACO】Dining
[题目链接] [JZXX]点击打开链接 [caioj]点击打开链接 [算法] 拆点+网络流 [代码] #include<bits/stdc++.h> using namespace std ...
- 【USACO】Optimal Milking
题目链接 : [POJ]点击打开链接 [caioj]点击打开链接 算法 : 1:跑一遍弗洛伊德,求出点与点之间的最短路径 2:二分答案,二分”最大值最小“ 3.1:建边,将 ...
- 【USACO】 Balanced Photo
[题目链接] 点击打开链接 [算法] 树状数组 [代码] #include<bits/stdc++.h> using namespace std; int i,N,ans,l1,l2; ] ...
随机推荐
- android 开发-自定义多节点进度条显示
看效果图: 里面的线段颜色和节点图标都是可以自定义的. main.xml <RelativeLayout xmlns:android="http://schemas.android.c ...
- string::rfind
该函数返回目标字符串(key)在源字符串中最后一次匹配的位置 如果没有找到匹配的位置则返回string::npos,是一个无符号整形数字,可以打印看看 //// string::rfind #incl ...
- 4554: [Tjoi2016&Heoi2016]游戏 二分图匹配
题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=4554 题解: 如果没有硬石头的话,就是’*‘点对应的行列建边,然后跑最大匹配 硬石头什么 ...
- discuz之同步登入
前言 首先感谢dozer学长吧UCenter翻译成C# 博客地址----------->http://www.dozer.cc/ 其次感谢群友快乐々止境同学的热心指导,虽然萍水相逢但让我 ...
- 2011斯坦福大学iOS应用开发教程学习笔记(第一课)MVC.and.Introduction.to.Objective-C
blog.csdn.net/totogo2010/article/details/8205810 目录(?)[-] 第一课名称 MVC and Introduction to Objective-C ...
- 如何理解JS项目
JS API(DOM/PhoneGap/Cordova/NodeJS/Library/Android/MongoDB....)最基础,可以看懂一行代码. -------> JS OOP, JS语 ...
- rpc 小例子
RpcFramework /* * Copyright 2011 Alibaba.com All right reserved. This software is the * confidential ...
- 同一网站不同和二级域名和不同子目录的cookie
1.cookie二级域名的实现: 用户其中一个站点登录,而且可以各个子频道间切换,保持登录状态设置Cookie时,使用如下代码即可:setcookie(name,value,expire,path,& ...
- iOS视频压缩
// // ViewController.m // iOS视频测试 // // Created by apple on 15/8/19. // Copyright (c) 2015年 tqh. All ...
- 利用正则表达式解析URL
-(NSString *) jiexi:(NSString *)CS webaddress:(NSString *)webaddress { NSError *error; NSS ...