zoukankan      html  css  js  c++  java
  • 10.4做题--USACO1.2方格转换

    方块转换
    描述
    一块N x N(1<=N<=10)正方形的黑白瓦片的图案要被转换成新的正方形图案。写一个程序来找出将原始图案按照以下列转换方法转换成新图案的最小方式:
    1:转90度:图案按顺时针转90度。
    2:转180度:图案按顺时针转180度。
    3:转270度:图案按顺时针转270度。
    4:反射:图案在水平方向翻转(以中央铅垂线为中心形成原图案的镜像)。
    5:组合:图案在水平方向翻转,然后再按照1到3之间的一种再次转换。
    6:不改变:原图案不改变。
    7:无效转换:无法用以上方法得到新图案。
    如果有多种可用的转换方法,请选择序号最小的那个。
    只使用1–7中的一个步骤来完成这次转换。
    格式
    PROGRAM NAME: transform
    INPUT FORMAT:
    (file transform.in)
    第一行: 单独的一个整数N。
    第二行到第N+1行: N行每行N个字符(不是“@”就是“-”);这是转换前的正方形。
    第N+2行到第2*N+1行: N行每行N个字符(不是“@”就是“-”);这是转换后的正方形。
    OUTPUT FORMAT:
    (file transform.out)
    单独的一行包括1到7之间的一个数字(在上文已描述)表明需要将转换前的正方形变为转换后的正方形的转换方法。

    SAMPLE INPUT
    3
    @-@
    ---
    @@-
    @-@
    @--
    --@
    SAMPLE OUTPUT
    1

    枚举方案就行了,要按顺序检验,用中间数组转换即可
    考察算法:模拟/枚举

    /*
        ID: 保密
        PROG: transform
        LANG: C++
    */
    #include<iostream>
    #include<cstring>
    #include<cstdio>
    using namespace std;
    const int N=15;
    int n;
    char a[N][N],b[N][N],c[N][N],d[N][N];//c和d是转换时用的中间数组
    void change(int x)
    {
        int i,j;
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
                d[i][j]=c[i][j];
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
                if(x==1)
                    c[i][j]=d[n-j+1][i];
                else
                    if(x==2)
                        c[i][j]=d[n-i+1][n-j+1];
                    else
                        if(x==3)
                            c[i][j]=d[j][n-i+1];
                        else
                            c[i][j]=d[i][n-j+1];
    }
    bool pd()
    {
        int i,j;
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
                if(c[i][j]!=b[i][j])
                    return false;
        return true;
    }
    int main()
    {
        freopen("transform.in","r",stdin);
        freopen("transform.out","w",stdout);
        int i,j,k;
        cin>>n;
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
                cin>>a[i][j];
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
                cin>>b[i][j];
        for(i=1;i<=4;i++)//1-4种方法
        {
            for(j=1;j<=n;j++)
                for(k=1;k<=n;k++)
                    c[j][k]=a[j][k];
            change(i);
            if(pd())
            {
                cout<<i<<endl;
                return 0;
            }
        }
        for(i=1;i<=3;i++)//第5种方法
        {
            for(j=1;j<=n;j++)
                for(k=1;k<=n;k++)
                    c[j][k]=a[j][k];
            change(4);
            change(i);
            if(pd())
            {
                cout<<5<<endl;
                return 0;
            }
        }
        for(j=1;j<=n;j++)
                for(k=1;k<=n;k++)
                    c[j][k]=a[j][k];
        if(pd())///第6种方法
        {
            cout<<6<<endl;
            return 0;
        }
        cout<<7<<endl;//排除法得出剩下的都是第7种
        return 0;
    }
    

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    LeetCode 1122. Relative Sort Array (数组的相对排序)
    LeetCode 46. Permutations (全排列)
    LeetCode 47. Permutations II (全排列 II)
    LeetCode 77. Combinations (组合)
    LeetCode 1005. Maximize Sum Of Array After K Negations (K 次取反后最大化的数组和)
    LeetCode 922. Sort Array By Parity II (按奇偶排序数组 II)
    LeetCode 1219. Path with Maximum Gold (黄金矿工)
    LeetCode 1029. Two City Scheduling (两地调度)
    LeetCode 392. Is Subsequence (判断子序列)
    写程序判断系统是大端序还是小端序
  • 原文地址:https://www.cnblogs.com/wuhu-xiaoshen/p/4918642.html
Copyright © 2011-2022 走看看