poj1166 the clock 链接
关于这个~~
9个钟表的指针0-4的数,
9个状态进行for循环
遍历每个状态
每个操作不会超过四次,四次之后就重头开始了
贴代码~~
post code:
#include<stdio.h> #include<string.h> int clock[10]; int original[10]; int rec[10]; char ch[10][20]={"ABDE","ABC","BCEF","ADG","BDEFH","CFI","DEGH","GHI","EFHI"}; void change(int k,int num) { int i,j,len; k=k-1; len=strlen(ch[k]); for(i=1;i<=num;i++){ for(j=0;j<len;j++) clock[ch[k][j]-'A'+1]=(clock[ch[k][j]-'A'+1]+1)%4; } } void ori(){ int i; for(i=1;i<=9;i++) clock[i]=original[i]; } int fun(int a,int b,int c,int d,int e,int f,int g,int h,int i){ int k; change(1,a); change(2,b); change(3,c); change(4,d); change(5,e); change(6,f); change(7,g); change(8,h); change(9,i); int sum=0; for(k=1;k<=9;k++) sum+=clock[k]; if(sum==0)return 1; else return 0; } int main() { while(scanf("%d",&clock[1])!=EOF){ int a,b,c,d,e,f,g,h,i,sum=0,min=999999; original[1]=clock[1]; for(i=2;i<=9;i++){ scanf("%d",&clock[i]); original[i]=clock[i]; } // for(i=1;i<=9;i++) // printf("%d ",clock[i]); // printf("\n"); for(a=0;a<4;a++){ //9重for循环 枚举每种操作的次数 for(b=0;b<4;b++){ for(c=0;c<4;c++){ for(d=0;d<4;d++){ for(e=0;e<4;e++){ for(f=0;f<4;f++){ for(g=0;g<4;g++){ for(h=0;h<4;h++){ for(i=0;i<4;i++){ sum=a+b+c+d+e+f+g+h+i; if(min<sum)continue; ori(); if(fun(a,b,c,d,e,f,g,h,i)==1){ if(min>sum){ min=sum; rec[1]=a; rec[2]=b; rec[3]=c; rec[4]=d; rec[5]=e; rec[6]=f; rec[7]=g; rec[8]=h; rec[9]=i; } } } } } } } } } } } int x; for(x=1;x<=9;x++) if(rec[x]!=0){ rec[x]--; printf("%d",x); break; } x=1; while(x!=10){ while(rec[x]!=0){ printf(" %d",x); rec[x]--; } x++; } printf("\n"); } }