操作間沒有次序關系,同一個操作最多重復3次。。。
可以直接暴力。。。
|-------| |-------| |-------| | | | | | | | |---O | |---O | | O | | | | | | | |-------| |-------| |-------| A B C |-------| |-------| |-------| | | | | | | | O | | O | | O | | | | | | | | | | |-------| |-------| |-------| D E F |-------| |-------| |-------| | | | | | | | O | | O---| | O | | | | | | | | | |-------| |-------| |-------| G H I
The goal is to find a minimal sequence of moves to return all the dials to 12 o'clock. Nine different ways to turn the dials on the clocks are supplied via a table below; each way is called a move. Select for each move a number 1 through 9 which will cause the dials of the affected clocks (see next table) to be turned 90 degrees clockwise.
Move Affected clocks 1 ABDE 2 ABC 3 BCEF 4 ADG 5 BDEFH 6 CFI 7 DEGH 8 GHI 9 EFHI9 9 12 9 12 12 9 12 12 12 12 12 12 12 12 6 6 6 5 -> 9 9 9 8-> 9 9 9 4 -> 12 9 9 9-> 12 12 12 6 3 6 6 6 6 9 9 9 12 9 9 12 12 12
[But this might or might not be the `correct' answer; see below.]
9 9 12 6 6 6 6 3 6
A single line that contains a space separated list of the shortest sequence of moves (designated by numbers) which returns all the clocks to 12:00. If there is more than one solution, print the one which gives the lowest number when the moves are concatenated (e.g., 5 2 4 6 < 9 3 1 1).
4 5 8 9
/* ID:qhn9992 PROG:clocks LANG:C++11 */ #include#include #include #include using namespace std; int a[10],c[10]; int b[10][10] ={ 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,0 }; int main() { freopen("clocks.in","r",stdin); freopen("clocks.out","w",stdout); int cnt=0; for(int i=1;i<=9;i++) { scanf("%d",a+i); a[i]=(a[i]/3)%4; } for(c[1]=0;c[1]<4;c[1]++) { for(c[2]=0;c[2]<4;c[2]++) { for(c[3]=0;c[3]<4;c[3]++) { for(c[4]=0;c[4]<4;c[4]++) { for(c[5]=0;c[5]<4;c[5]++) { for(c[6]=0;c[6]<4;c[6]++) { for(c[7]=0;c[7]<4;c[7]++) { for(c[8]=0;c[8]<4;c[8]++) { for(c[9]=0;c[9]<4;c[9]++) { ///check.... bool flag=true; for(int i=1;i<=9;i++) { int t=a[i]; for(int j=1;j<=9;j++) { t+=b[j][i-1]*c[j]; } t=t%4; if(t) { flag=false; break; } } if(flag) { for(int i=1;i<=9;i++) { while(c[i]--) { if(flag) { flag=false; } else putchar(32); printf("%d",i); } } putchar(10); return 0; } else continue; } } } } } } } } } return 0; }