USACO-Section 1.2 Transformations [...]

来源:互联网 发布:hbase mysql元数据 编辑:程序博客网 时间:2024/05/22 21:40

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: madara01PROG: transformLANG: C++*/#include <iostream>#include <fstream>#include <string>#define cin fin#define cout fout#define MAX 10using 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;}
原创粉丝点击