http://cxsjsxmooc.openjudge.cn/2018t2fallsum/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;
}