zoukankan      html  css  js  c++  java
  • USACO SECTION 1.1.2 Transformations 爆搜

      题目链接: http://train.usaco.org/usacoprob2?a=f6bhTTJaVRy&S=transform

      题目大意: 给你一个初始矩阵和一个目的矩阵, 还有几种操作, 输出最小的操作号。

      解题思路: 有个坑就是不应该直接判等, 因为要输出最小的操作号, 有可能就是旋转一下也可以得到原图形那么输出的就不是6了, 然后就是怎么旋转这个矩形, 想了好久然后想错了.....不说了, 上代码吧。

      代码: 

    /*
     ID: wl199701
     PROG: transform
     LANG: C++
     */
    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <string>
    #include <fstream>
    #include <iterator>
    #include <map>
    #include <algorithm>
    using namespace std;
    
    int n;
    const int maxn = 15;
    
    struct node {
        char a[maxn][maxn];
        node() {
            memset(a, 0, sizeof(a));
        }
    };
    node st, des;
    
    node rnode() {
        node temp;
        for( int i = 1; i <= n; i++ ) {
            for( int j = 1; j <= n; j++ ) {
                cin >> temp.a[i][j];
            }
        }
        return temp;
    }
    
    int ok( node n1, node n2 ) {
        for( int i = 1; i <= n; i++ ) {
            for( int j = 1; j <= n; j++ ) {
                if( n1.a[i][j] != n2.a[i][j] ) return 0;
            }
        }
        return 1;
    }
    
    void debug( node nd ) {
        for( int i = 1; i <= n; i++) {
            for( int j = 1; j <= n; j++ ) {
                cout << nd.a[i][j];
            }
            cout << endl;
        }
    }
    
    node change(node ori, int op) {
        node temp;
        for( int i = 1; i <= n; i++ ) {
            for( int j = 1; j <= n; j++ ) {
                switch (op) {
                    case 1:
                        temp.a[i][j] = ori.a[n-j+1][i];
                        break;
                    case 2:
                        temp.a[i][j] = ori.a[n+1-i][n+1-j];
                        break;
                    case 3:
                        temp.a[i][j] = ori.a[j][n-i+1];
                        break;
                    case 4:
                        temp.a[i][j] = ori.a[i][n+1-j];
                        break;
                }
            }
        }
        return temp;
    }
    
    
    int main(){
        freopen("transform.in","r",stdin);
        freopen("transform.out","w",stdout);
        while( scanf( "%d", &n ) == 1 ) {
            node a, b;
            a = rnode();
            b = rnode();
    //        node temp = change(a, 1);
    //        debug(temp);
            int flag = 0;
            int i;
            for( i = 1; i <= 4; i++ ) {
                node temp;
                temp = change(a, i);
                if( ok( temp, b ) ) {
                    flag = 1;
                    cout << i << endl;
                    break;
                }
            }
            if( !flag ) {
                node temp = change( a, 4 );
                for( int j = 1; j <= 3; j++ ) {
                    node temp1 = change(temp, j);
                    if( ok( temp1, b ) ) {
                        flag = 1;
                        cout << "5" << endl;
                        break;
                    }
                }
            }
            if( !flag ) {
                if( ok( a, b ) ) {
                    cout << "6" << endl;
                    continue;
                }
            }
            if( !flag ) {
                cout << "7" << endl;
            }
        }
        return 0;
    }
    View Code

      思考: 自己的抽象思维能力还是太弱, 自己的代码能力还是太弱, 所以说还要加强, 另外今天该找丁濛了。

  • 相关阅读:
    rails 相关文件
    linux学习---vi进行多行的copy,cut
    设计
    互联网---现在正在变成过去
    testing
    TTl
    如何成为优秀的性能测试工程师
    linuX学习
    Programiz 中文系列教程·翻译完成
    Programiz C 语言教程·翻译完成
  • 原文地址:https://www.cnblogs.com/FriskyPuppy/p/6950322.html
Copyright © 2011-2022 走看看