哎,纠结了那么久,终于过了,本来很直接的想到了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"); }