USACO section 1.2.2 Transformations

1. 被这道题虐了无数次,每次编译通过,但是运行会错误(当时用的是string数组), 后来把string数组改成char[][]二维数组就好了;

2. 给的参考代码是不对的

3. 如果函数的返回类型是数组,只能通过指针来实现,但是参考代码给了一种巧妙的方法,把数组封装成结构体,然后返回结构体

以下是我的代码:

/*
ID: dollar4
PROG: transform
LANG: C++
*/
#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>
#include <cstring>

using namespace std;
typedef char array[10][10];
char ori[10][10], tasf[10][10];
char rst[10][10];
int n;

int rot90(char arr[][10], array &cag)
{
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
        {
            cag[j][n-1-i] = arr[i][j];
        }
    return 1;
}
int rot180(char arr[][10], array &cag)
{
    char cag1[10][10];
    rot90(arr, cag1);
    rot90(cag1, cag);
    return 1;
}
int rot270(char arr[][10], array &cag)
{
    char cag1[10][10];
    rot180(arr, cag1);
    rot90(arr, cag);
    return 1;
}
int reflect(char arr[][10], array &cag)
{
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            cag[i][n-j-1] = arr[i][j];
    return 1;
}
int grp90(char arr[][10], array &cag)
{
    char cag1[10][10];
    reflect(arr, cag1);
    rot90(cag1, cag);
    return 1;
}
int grp2(char arr[][10], array &cag)
{
    char cag1[10][10];
    reflect(arr, cag1);
    rot180(cag1, cag);
    return 1;
}
int grp3(char arr[][10], array &cag)
{
    char cag1[10][10];
    reflect(arr, cag1);
    rot270(cag1, cag);
    return 1;
}
bool equ(char arr1[][10], char arr2[][10])
{
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            if (arr1[i][j] != arr2[i][j])
                return false;
            else continue;
    return true;
}
int main()
{
    ofstream fout ("transform.out");
    ifstream fin ("transform.in");
    int i, j;
    fin >> n;
    for (i = 0; i < n; i++)
        for (j = 0; j < n; j++)
            fin >> ori[i][j];
    for (i = 0; i < n; i++)
        for (j = 0; j < n; j++)
            fin >> tasf[i][j];
    if (rot90(ori, rst) && equ(rst, tasf))
        fout << 1 << endl;
    else if (rot180(ori, rst) && equ(rst, tasf))
        fout << 2 << endl;
    else if (rot270(ori, rst) && equ(rst, tasf))
        fout << 3 << endl;
    else if (reflect(ori, rst) && equ(rst, tasf))
        fout << 4 << endl;
    else if (grp90(ori, rst) && equ(rst, tasf))
        fout << 5 << endl;
    else if (grp2(ori, rst) && equ(rst, tasf))
        fout << 5 << endl;
    else if (grp3(ori, rst) && equ(rst, tasf))
        fout << 5 << endl;
    else if (equ(ori, tasf))
        fout << 6 << endl;
    else fout << 7 << endl;

    return 0;
}


以下是参考代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>

#define MAXN 10

typedef struct Board Board;
struct Board {
    int n;
    char b[MAXN][MAXN];
};

/* rotate 90 degree clockwise: [r, c] -> [c, n+1 - r] */
Board
rotate(Board b)
{
    Board nb;
    int r, c;

    nb = b;
    for(r=0; r<b.n; r++)
    for(c=0; c<b.n; c++)
        nb.b[c][b.n+1 - r] = b.b[r][c];

    return nb;
}

/* reflect board horizontally: [r, c] -> [r, n-1 -c] */
Board
reflect(Board b)
{
    Board nb;
    int r, c;

    nb = b;
    for(r=0; r<b.n; r++)
    for(c=0; c<b.n; c++)
        nb.b[r][b.n-1 - c] = b.b[r][c];

    return nb;
}

/* return non-zero if and only if boards are equal */
int
eqboard(Board b, Board bb)
{
    int r, c;

    if(b.n != bb.n)
        return 0;

    for(r=0; r<b.n; r++)
    for(c=0; c<b.n; c++)
        if(b.b[r][c] != bb.b[r][c])
            return 0;
    return 1;
}

Board
rdboard(FILE *fin, int n)
{
    Board b;
    int r, c;

    b.n = n;
    for(r=0; r<n; r++) {
        for(c=0; c<n; c++)
            b.b[r][c] = getc(fin);
        assert(getc(fin) == '\n');
    }
    return b;
}

void
main(void)
{
    FILE *fin, *fout;
    Board b, nb;
    int n, change;

    fin = fopen("transform.in", "r");
    fout = fopen("transform.out", "w");
    assert(fin != NULL && fout != NULL);

    fscanf(fin, "%d\n", &n);
    b = rdboard(fin, n);
    nb = rdboard(fin, n);

    if(eqboard(nb, rotate(b)))
        change = 1;
    else if(eqboard(nb, rotate(rotate(b))))
        change = 2;
    else if(eqboard(nb, rotate(rotate(rotate(b)))))
        change = 3;
    else if(eqboard(nb, reflect(b)))
        change = 4;
    else if(eqboard(nb, rotate(reflect(b)))
         || eqboard(nb, rotate(rotate(reflect(b))))
         || eqboard(nb, rotate(rotate(rotate(reflect(b))))))
        change = 5;
    else if(eqboard(nb, b))
        change = 6;
    else
        change = 7;

    fprintf(fout, "%d\n", change);

    exit(0);
}


你可能感兴趣的:(transform)