深深的感受到自己的算法有多菜了,这种题型以前还在poj上做过,每种move超过3次后相当于mode 4,所以每种move只可能0-3 4种情况,用遍历就是4^9种情况。
开始想的挺好,应为要求组合数最小,又move和次序无关。想着number从1-9然后是11-19 22-29 33-39。。。最后到111222333444...999,这种顺序递增遍历肯定比直接dfs快。
可是想了半天也组织不好 number递增写法...最后还是用dfs做了,dfs开始也有点头大,无从下手,听说还有bfs做的,待好好研究下。
/* ID: hubiao cave PROG: clocks LANG: C++ */ #include<iostream> #include<fstream> #include<string> #include<set> using namespace std; int clocks[10]; int clock2[10]; int step[10]; //void print(int n); int const move[9][9]={{3,3,0,3,3},{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}}; void dfs(int); bool judge(); string globstr("NULL"); int count; int main() { ifstream fin("clocks.in"); ofstream fout("clocks.out"); for(int i=1;i<=9;i++) { fin>>clocks[i]; clocks[i]%=12; clock2[i]=clocks[i]; } dfs(1); for(int i=0;i<globstr.length();i++) { if(i<globstr.length()-1) fout<<globstr[i]<<" "; else fout<<globstr[i]<<endl; } //fout<<count; return 0; } void dfs(int index) { if(index<=9) { for(int i=0;i<=3;i++) { step[index]=i; dfs(index+1); } } else { count++; if(judge()) { for(int i=1;i<=9;i++) clocks[i]=clock2[i]; string str; for(int i=1;i<=9;i++) { for(int n=0;n<step[i];n++) { char ch=i+48; str=str+ch; } } if(globstr=="NULL") { globstr=str; } else { if(globstr.length()>str.length()) globstr=str; if(globstr.length()==str.length()) { for(int i=0;i<str.length();i++) { if(globstr[i]>str[i]) globstr=str; if(globstr[i]<str[i]) break; } } } } for(int i=1;i<=9;i++) clocks[i]=clock2[i]; } } bool judge() { for(int i=1;i<=9;i++) { for(int m=0;m<9;m++) { clocks[i]=clocks[i]+step[m+1]*move[m][i-1]; clocks[i]=clocks[i]%12; } if(clocks[i]!=0) return false; } return true; } void print(int n) { if(n>=1) { for(int i=0;i<=3;i++) { clocks[n]=i; print(n-1); } } else { for(int i=3;i>0;i--) { cout<<clocks[i]; } cout<<endl; } }