The Clocks

The Clocks

题目链接:http://poj.org/problem?id=1166

题意:给出9个时钟的初始状态,问最少通过几次操作,能使每个时钟指向12点(每次操作都会使对应时钟顺时针旋转90度)

暴搜

考虑到每种操作最多进行3次(如果进行4次就和不进行操作一样),直接用49的暴搜

代码如下:

 1 #include <cstdio>
 2 #include <vector>
 3 #include <cstring>
 4 #define pb(x) push_back(x)
 5 #define mk(x,y) make_pair(x,y)
 6 #define f(x) (x-'A')
 7 using namespace std;
 8 typedef pair<int,int> P;
 9 int a[9],ans[9],s[9],Min;
10 vector<int>p[9];
11 void check(){
12     int sum=0,b[9];
13     for(int i=0;i<9;++i)b[i]=a[i];
14     for(int i=0;i<9;++i){
15         sum+=s[i];
16         for(int j=0;j<(int)p[i].size();++j){
17             int t=p[i][j];
18             b[t]=(b[t]+s[i])%4;
19         }
20     }
21     for(int i=0;i<9;++i)
22         if(b[i])return;
23     if(sum<Min){
24         Min=sum;
25         for(int i=0;i<9;++i)ans[i]=s[i];
26     }
27 }
28 void dfs(int op){
29     if(op>=9){
30         check();
31         return;
32     }
33     for(int i=0;i<4;++i){
34         s[op]=i;
35         dfs(op+1);
36     }
37 }
38 int main(void){
39     p[0].pb(f('A')),p[0].pb(f('B')),p[0].pb(f('D')),p[0].pb(f('E'));
40     p[1].pb(f('A')),p[1].pb(f('B')),p[1].pb(f('C'));
41     p[2].pb(f('B')),p[2].pb(f('C')),p[2].pb(f('E')),p[2].pb(f('F'));
42     p[3].pb(f('A')),p[3].pb(f('D')),p[3].pb(f('G'));
43     p[4].pb(f('B')),p[4].pb(f('D')),p[4].pb(f('E')),p[4].pb(f('F')),p[4].pb(f('H'));
44     p[5].pb(f('C')),p[5].pb(f('F')),p[5].pb(f('I'));
45     p[6].pb(f('D')),p[6].pb(f('E')),p[6].pb(f('G')),p[6].pb(f('H'));
46     p[7].pb(f('G')),p[7].pb(f('H')),p[7].pb(f('I'));
47     p[8].pb(f('E')),p[8].pb(f('F')),p[8].pb(f('H')),p[8].pb(f('I'));
48     Min=100000000;
49     for(int i=0;i<9;++i)scanf("%d",&a[i]);
50     dfs(0);
51     for(int i=0;i<9;++i)
52         for(int j=0;j<ans[i];++j)
53             printf("%d ",i+1);
54 }

 

posted @ 2016-12-05 20:27  barriery  阅读(281)  评论(0编辑  收藏  举报