• 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);
    }


  • 相关阅读:
    阻止表单重复提交的办法以及支付成功后页面后退重复提交的解决方案
    jsp页面的共用
    空间谱专题02:波束形成(Beamforming)
    空间谱专题01:信号模型
    空间谱专题00:综述
    BP神经网络
    fdatool的滤波器设计
    Testbench
    Cordic算法简介
    快速删除注释
  • 原文地址:https://www.cnblogs.com/dollarzhaole/p/3188948.html
Copyright © 2020-2023  润新知