您的位置:首页 > 其它

USACO-Section 1.2 Transformations [...]

2017-05-28 22:18 435 查看
2017-05-28

题目大意:

给定两个N*N的字符矩阵(1<=N<=10,字符只有’@’或’-‘),定义如下7种变换:

/#1:将矩阵顺时针翻转90度;

/#2:将矩阵顺时针翻转180度;

/#3:将矩阵顺时针翻转270度;

/#4:将矩阵水平翻转;

/#5:先将矩阵水平翻转,再进行#1~#3的任意一次变换;

/#6:没有变换;

/#7:不属于上述任何一种变换。

要求判断第二个矩阵相对于第一个矩阵所做的变换,输出为7个编号中最小的那个。

样例输入:

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


样例输出:

1


解题思路:

这个题目没有什么特别的思路,就是规则很多-_-||。个人注意到的有以下几点:

(1)输出为2位:一个数字(1~7),别忘了还有一个回车-_-||

(2)按部就班从编号1到编号6依次判断就好,别想着先判断是否没有变换,因为某些特殊矩阵即使经过1~5的变换看起来还是老样子 -_-||

(3)还有就是注意写判定某种变换的函数时,注意是将前一个矩阵进行对应的变换后与后一个矩阵比较。

代码如下:

/*
ID: madara01
PROG: transform
LANG: C++
*/
#include <iostream>
#include <fstream>
#include <string>
#define cin fin
#define cout fout
#define MAX 10

using namespace std;

int N,type = 0;
int ini[MAX][MAX];  //初始矩阵
int aft[MAX][MAX];  //变换后的矩阵

void horizon() {
int i,j;
int mid[MAX][MAX];
for(i = 0; i<N; i++)
{
for( j = 0; j<N; j++)
{
mid[i][j] = ini[i][N-j-1];
}
}
for(i = 0; i<N; i++)
{
for( j = 0; j<N; j++)
{
ini[i][j] = mid[i][j];
}
}
}

int Type_1() {  //顺时针转90度变换
int i,j;
for(i = 0; i < N; i++)
{
for(j = 0; j < N; j++)
{
if(aft[i][j] != ini[N-j-1][i])  return -1;
}
}
return 1;
}

int Type_2() {  //顺时针转180度变换
int i,j;
for(i = 0; i < N; i++)
{
for(j = 0; j < N; j++)
{
if(aft[i][j] != ini[N-i-1][N-j-1])  return -1;
}
}
return 1;
}

int Type_3() {  //顺时针转270度变换
int i,j;
for(i = 0; i < N; i++)
{
for(j = 0; j < N; j++)
{
if(aft[i][j] != ini[j][N-i-1])  return -1;
}
}
return 1;
}

int Type_4() {  //水平翻转变换
int i,j;
for(i = 0; i < N; i++)
{
for(j = 0; j < N; j++)
{
if(aft[i][j] != ini[i][N-j-1])  return -1;
}
}
return 1;
}

int Type_6() {  //没有变换
int i,j;
for(i = 0; i < N; i++)
{
for(j = 0; j < N; j++)
{
if(aft[i][j] != ini[i][j])  return -1;
}
}
return 1;
}

int judgeType() {  //判断为何种变换
if(Type_1() > 0) return 1;
if(Type_2() > 0) return 2;
if(Type_3() > 0) return 3;
if(Type_4() > 0) return 4;
horizon();     //将ini做水平翻转变换
if(Type_1() > 0) return 5;
if(Type_2() > 0) return 5;
if(Type_3() > 0) return 5;
horizon();
if(Type_6() > 0) return 6;
return 7;
}

int main(int argc, char **argv)
{
int i,j;
string getIt;
ofstream fout ("transform.out");
ifstream fin ("transform.in");
cin >> N;
for(i = 0; i < N; i++)
{
cin >> getIt;
for(j = 0; j < N; j++)
{
if(getIt[j] == '@')  ini[i][j] = 0; //当字符为'@'时将二维数组对应位置元素置为0
else  ini[i][j] = 1;
}
}
for(i = 0; i < N; i++)
{
cin >> getIt;
for(j = 0; j < N; j++)
{
if(getIt[j] == '@')  aft[i][j] = 0;
else aft[i][j] = 1;
}
}
type = judgeType();
cout << type << endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: