【题解】002:拨钟问题

http://cxsjsxmooc.openjudge.cn/2018t2winterw1/002/

提示:由特殊密码锁题目得到启示:第一行即为枚举的局部。那么如何寻找第一行的枚举情况呢?

观察:操作123如果被固定,那么由第一行情况可以固定出操作456,再由第二行固定操作79,再根据E和DHI的情况选择

启示:枚举的局部有思路之后要谨慎考虑枚举对象(钟表 or 操作)

#include<cstdio> 
#include<iostream>
#include<cstring>
using namespace std;
int change[5][5];
int sumi=0,s[11],t[11];
int sum=20000;
void step1(int i)//
{
    change[0][0] = (change[0][0] + i + 4) % 4;
    change[0][1] = (change[0][1] + i + 4) % 4;
    change[1][0] = (change[1][0] + i + 4) % 4;
    change[1][1] = (change[1][1] + i + 4) % 4; 
    sumi+=i;
}
void step2(int i)//
{
    change[0][0] = (change[0][0] + i + 4) % 4;
    change[0][1] = (change[0][1] + i + 4) % 4;
    change[0][2] = (change[0][2] + i + 4) % 4;
    sumi+=i;
}
void step3(int i)//
{
    change[0][2] = (change[0][2] + i + 4) % 4;
    change[0][1] = (change[0][1] + i + 4) % 4;
    change[1][2] = (change[1][2] + i + 4) % 4;
    change[1][1] = (change[1][1] + i + 4) % 4; 
    sumi+=i;
}
void step4(int i)//
{
    change[0][0] = (change[0][0] + i + 4) % 4;
    change[1][0] = (change[1][0] + i + 4) % 4;
    change[2][0] = (change[2][0] + i + 4) % 4;
    sumi+=i;
}
void step5(int i)//
{
    change[2][1] = (change[2][1] + i + 4) % 4;
    change[0][1] = (change[0][1] + i + 4) % 4;
    change[1][2] = (change[1][2] + i + 4) % 4;
    change[1][0] = (change[1][0] + i + 4) % 4; 
    change[1][1] = (change[1][1] + i + 4) % 4; 
    sumi+=i;
}
void step6(int i)//
{
    change[0][2] = (change[0][2] + i + 4) % 4;
    change[1][2] = (change[1][2] + i + 4) % 4;
    change[2][2] = (change[2][2] + i + 4) % 4;
    sumi+=i;
}
void step7(int i)//
{
    change[2][0] = (change[2][0] + i + 4) % 4;
    change[2][1] = (change[2][1] + i + 4) % 4;
    change[1][0] = (change[1][0] + i + 4) % 4;
    change[1][1] = (change[1][1] + i + 4) % 4; 
    sumi+=i;
}
void step8(int i)//
{
    change[2][0] = (change[2][0] + i + 4) % 4;
    change[2][1] = (change[2][1] + i + 4) % 4;
    change[2][2] = (change[2][2] + i + 4) % 4;
    sumi+=i;
}
void step9(int i)//
{
    change[2][2] = (change[2][2] + i + 4) % 4;
    change[2][1] = (change[2][1] + i + 4) % 4;
    change[1][2] = (change[1][2] + i + 4) % 4;
    change[1][1] = (change[1][1] + i + 4) % 4;
    sumi+=i; 
}
void step(int x,int y){
    
}
void Print()
{
    for (int i=1;i<=9;i++)
        for (int j=1;j<=s[i];j++)
            printf("%d ",i);
}

int main()
{

    for(int i=0;i<3;++i)
        for(int j=0;j<3;++j)
            scanf("%d",&change[i][j]);
    for(t[1]=0;t[1]<=3;t[1]++)
    {
        step1(t[1]);
        for(t[2]=0;t[2]<=3;t[2]++)
        {
            step2(t[2]);
            for(t[3]=0;t[3]<=3;t[3]++)
            {
                step3(t[3]);
                t[4] = (4 - change[0][0])%4;
                step4(t[4]);
                t[5] = (4 - change[0][1])%4;
                step5(t[5]);
                t[6] = (4 - change[0][2])%4;
                step6(t[6]);
                t[7] = (4 - change[1][0])%4;
                step7(t[7]);
                t[9] = (4 - change[1][2])%4;
                step9(t[9]);
                
                if(change[1][1] % 4 == 0 && change[2][0]==change[2][1] && change[2][0]==change[2][2])//E+GHI
                {
                    t[8] = (4 - change[2][0])%4;
                    if(sumi<sum)
                    {
                        sum=sumi;
                        for (int i=1;i<=9;i++) s[i]=t[i];
                    }
                }
                step4(-t[4]);
                step5(-t[5]);
                step6(-t[6]);
                step7(-t[7]);
                step9(-t[9]);
                step3(-t[3]);
            //    t[8]=0; 
            }
            step2(-t[2]);
        }
        step1(-t[1]);
    }
    Print();
    return 0;
}

猜你喜欢

转载自blog.csdn.net/zjt1027/article/details/82557645
002
今日推荐