哎,纠结了那么久,终于过了,本来很直接的想到了BFS,可是怎么纠结也过不了,orz……
还是用DFS了,嘿嘿,一开始好囧,没注意到,其实每一种方法最多只能走四次,走四次就回到初始状态了;
DFS的过程比较好理解,从第一种方法开始,枚举这种方法走到次数,接着第二种方法,…………,这样,知道 第九种方法,再判断是否满足条件……
/*
ID: nanke691
LANG: C++
TASK: clocks
*/
#include<iostream>
#include<algorithm>
#include<fstream>
#include<string.h>
using namespace std;
int dir[9][9]={{3,3,0,3,3,0,0,0,0},{3,3,3},{0,3,3,0,3,3},{3,0,0,3,0,0,3},{0,3,0,3,3,3,0,3},
{0,0,3,0,0,3,0,0,3},{0,0,0,3,3,0,3,3},{0,0,0,0,0,0,3,3,3},{0,0,0,0,3,3,0,3,3}};
int ans[9];
int clock1[9];
int bestmove;
void dfs(int *move ,int k)
{
if(k==9)
{
for(int i=0;i<9;i++)
if(clock1[i]%12!=0)
return ;
int cnt=0;
for(int i=0;i<9;i++)
cnt+=move[i];
if(bestmove==0 || cnt<bestmove)//比较,记录步数最少的
{
bestmove=cnt;
for(int i=0;i<9;i++)
ans[i]=move[i];
return ;
}
}
for(int rep=3;rep>=0;rep--)
{
for(int i=0;i<rep;i++)
{
for(int j=0;j<9;j++)
clock1[j]+=dir[k][j];
}
move[k]=rep;
dfs(move,k+1);
for(int i=0;i<rep;i++)//还原
for(int j=0;j<9;j++)
clock1[j]-=dir[k][j];
}
}
int main()
{
int move[9];
freopen("clocks.in","r",stdin);
freopen("clocks.out","w",stdout);
for(int i=0;i<9;i++)
scanf("%d",&clock1[i]);
bestmove=0;
memset(ans,0,sizeof(ans));
dfs(move,0);
char *s="";
for(int i=0;i<9;i++)
{
for(int j=0;j<ans[i];j++)
{
printf("%s%d",s,i+1);
s=" ";
}
}
printf("\n");
}