使用暴力搜索,枚举所有移动方案,及时中止不合时方案来节省时间。到现在依旧不会使用更高级的搜索算法,下一步需要学习一下理论知识。
/* ID:jzzlee1 PROG:clocks LANG:C++ */ #include<iostream> #include<fstream> #include<cstring> #include<cctype> #include<cstdio> using namespace std; ifstream fin("clocks.in"); ofstream fout("clocks.out"); int a[10],s=0,m=1000000,c[10],d[10],e[10]; //b[][]保存9种移动方法,每移一次加1 int b[10][10]={ {0,0,0,0,0,0,0,0,0,0}, {0,1,1,0,1,1,0,0,0,0}, {0,1,1,1,0,0,0,0,0,0}, {0,0,1,1,0,1,1,0,0,0}, {0,1,0,0,1,0,0,1,0,0}, {0,0,1,0,1,1,1,0,1,0}, {0,0,0,1,0,0,1,0,0,1}, {0,0,0,0,1,1,0,1,1,0}, {0,0,0,0,0,0,0,1,1,1}, {0,0,0,0,0,1,1,0,1,1} }; bool flag=true; void find() { //c[]保存每种方法的使用次数,最多3次,因为第4次就会回到原来位置 //c[0]~c[9]是一种移动方案的组合, for(c[1]=0;c[1]<=3;c[1]++) for(c[2]=0;c[2]<=3;c[2]++) for(c[3]=0;c[3]<=3;c[3]++) for(c[4]=0;c[4]<=3;c[4]++) for(c[5]=0;c[5]<=3;c[5]++) for(c[6]=0;c[6]<=3;c[6]++) for(c[7]=0;c[7]<=3;c[7]++) for(c[8]=0;c[8]<=3;c[8]++) for(c[9]=0;c[9]<=3;c[9]++) { //对每种移动方案进行检验 flag=true; for(int i=1;i<=9;i++) a[i]=d[i]; for(int i=1;i<=9;i++) //i:1~9,依次检验a[]的9个位置 { for(int j=1;j<=9;j++) //对a[i]位置使用当前移动方案 a[i]+=b[j][i]*c[j]; a[i]%=4; if(a[i]!=0) //如果当前移动方案对a[i]位置不合适,不必继续检验a[i+1],退出检验该方案的循环以节省时间 { flag=false; break; } } if(flag)//方案通过检验 if(c[1]+c[2]+c[3]+c[4]+c[5]+c[6]+c[7]+c[8]+c[9]<m) { m=c[1]+c[2]+c[3]+c[4]+c[5]+c[6]+c[7]+c[8]+c[9]; for(int i=1;i<=9;i++) //记录该方案每种移动方法的使用次数 e[i]=c[i]; } } } int main() { for(int i=1;i<=9;i++) { //cin>>a[i]; fin>>a[i]; a[i]/=3; a[i]%=4; d[i]=a[i]; } find(); flag=false; for(int i=1;i<=9;i++) for(int j=1;j<=e[i];j++) { if(flag) //cout<<" "; fout<<" "; else flag=true; //cout<<i; fout<<i; } //cout<<endl; fout<<endl; return 0; }