终于AC了,暴搜,简单题用传统方法就好……
/*
ID:zizz-zi1
LANG:C
TASK:clocks
*/
#include <stdio.h>
int f[9][9]={
{1,1,0,1,1,0,0,0,0},
{1,1,1,0,0,0,0,0,0},
{0,1,1,0,1,1,0,0,0},
{1,0,0,1,0,0,1,0,0},
{0,1,0,1,1,1,0,1,0},
{0,0,1,0,0,1,0,0,1},
{0,0,0,1,1,0,1,1,0},
{0,0,0,0,0,0,1,1,1},
{0,0,0,0,1,1,0,1,1}};
int a[9]={0};
int t[9]={0};
int ans[9]={0};
unsigned min;
unsigned cal(void)
{
int i,j;
unsigned sum=0;
for(i=0;i<9;i++)
for(j=1;j<=t[i];j++){
sum*=10;
sum+=(i+1);
}
return sum;
}
int check(void)
{
int i;
unsigned tmp;
for(i=0;i<9;i++)
if(a[i]!=0) return 0;
tmp=cal();
if (min==0) {
min=tmp;
for(i=0;i<9;i++)
ans[i]=t[i];
}
else
if(tmp<min){
min=tmp;
for(i=0;i<9;i++)
ans[i]=t[i];
}
return 0;
}
void dfs(int deep)
{
int i,j,k;
if(deep==9)
check();
else{
dfs(deep+1);
for(i=1;i<=3;i++){
for(k=0;k<i;k++)
for(j=0;j<9;j++)
a[j]=(a[j]+f[deep][j])%4;
t[deep]=i;
dfs(deep+1);
t[deep]=0;
for(k=0;k<i;k++)
for(j=0;j<9;j++)
a[j]=(a[j]-f[deep][j]+4)%4;
}
}
}
int main(void)
{
FILE *fin,*fout;
fin=fopen("clocks.in","r");
fout=fopen("clocks.out","w");
int i,j,tmp;
for(i=0;i<9;i++){
fscanf(fin,"%d",&tmp);
a[i]=tmp/3;
a[i]%=4;
}
dfs(0);
for(i=0;i<9;i++)
if(ans[i]>0){
fprintf(fout,"%d",i+1);
ans[i]--;
break;
}
for(i=0;i<9;i++)
for(j=0;j<ans[i];j++)
fprintf(fout," %d",i+1);
fprintf(fout,"\n");
fclose(fin);fclose(fout);
return 0;
}