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

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

  • 相关阅读:
    Shader实例:溶解效果(Dissolve)
    Shader实例:扭曲,漩涡
    Shader实例:边缘发光和描边
    Shader实例:2D流光
    基础知识:Q&A
    Shader实例:一台旧电视
    Unity Lightmap动态加载研究
    Excel转Json,Json转CSharp
    瓦特平台全部出售69.9元、为了学习、为了进步、为了明天!
    分享一个文件查找、替换制定的字符或数字之CS程序、附带源码
  • 原文地址:https://www.cnblogs.com/wuhu-xiaoshen/p/4918642.html
Copyright © 2020-2023  润新知