操作間沒有次序關系,同一個操作最多重復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;
}