USACO 6.5 The Clocks

Posted sigongzi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了USACO 6.5 The Clocks相关的知识,希望对你有一定的参考价值。

The Clocks
IOI‘94 - Day 2

Consider nine clocks arranged in a 3x3 array thusly:

|-------|    |-------|    |-------|    
|       |    |       |    |   |   |    
|---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 EFHI

Example

Each number represents a time according to following table:

9 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.]

PROGRAM NAME: clocks

INPUT FORMAT

Lines 1-3: Three lines of three space-separated numbers; each number represents the start time of one clock, 3, 6, 9, or 12. The ordering of the numbers corresponds to the first example above.

SAMPLE INPUT (file clocks.in)

9 9 12
6 6 6
6 3 6

OUTPUT FORMAT

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).

SAMPLE OUTPUT (file clocks.out)

4 5 8 9

————————————————————————————————————题解
4^9果断暴搜
然后秒过……
用了一个指向函数的指针减少代码量
  1 /*
  2 LANG: C++
  3 PROG: clocks
  4 */
  5 #include <iostream>
  6 #include <cstdio>
  7 #include <algorithm>
  8 #include <cstring>
  9 #include <cmath>
 10 #define siji(i,x,y) for(int i=(x) ; i <= (y) ; ++i)
 11 #define xiaosiji(i,x,y) for(int i = (x) ; i < (y); ++i)
 12 #define gongzi(j,x,y) for(int j = (x) ; j >= (y) ; --j)
 13 #define ivorysi
 14 #define mo 11447
 15 #define eps 1e-8
 16 #define o(x) ((x)*(x))
 17 using namespace std;
 18 typedef long long ll;
 19 int clo[4][4],rec[10],ans[10],all=10000;
 20 void span(int &a) {
 21     a=(a+1)%4;
 22 }
 23 bool check() {
 24     siji(i,1,3) {
 25         siji(j,1,3) {
 26             if(clo[i][j]!=3)return false;
 27         }
 28     }
 29     return true;
 30 }
 31 void del1() {
 32     span(clo[1][1]);
 33     span(clo[1][2]);
 34     span(clo[2][1]);
 35     span(clo[2][2]);
 36 }
 37 void del2() {
 38     span(clo[1][1]);
 39     span(clo[1][2]);
 40     span(clo[1][3]);
 41 }
 42 void del3() {
 43     span(clo[1][2]);
 44     span(clo[1][3]);
 45     span(clo[2][2]);
 46     span(clo[2][3]);
 47 }
 48 void del4() {
 49     span(clo[1][1]);
 50     span(clo[2][1]);
 51     span(clo[3][1]);
 52 }
 53 void del5() {
 54     span(clo[1][2]);
 55     span(clo[2][1]);
 56     span(clo[2][2]);
 57     span(clo[2][3]);
 58     span(clo[3][2]);
 59 }
 60 void del6() {
 61     span(clo[1][3]);
 62     span(clo[2][3]);
 63     span(clo[3][3]);
 64 }
 65 void del7() {
 66     span(clo[2][1]);
 67     span(clo[2][2]);
 68     span(clo[3][1]);
 69     span(clo[3][2]);
 70 }
 71 void del8() {
 72     span(clo[3][1]);
 73     span(clo[3][2]);
 74     span(clo[3][3]);
 75 }
 76 void del9() {
 77     span(clo[2][2]);
 78     span(clo[2][3]);
 79     span(clo[3][2]);
 80     span(clo[3][3]);
 81 }
 82 void dfs(int dep,int times) {
 83     if(times>=all) return;
 84     if(dep>9) {
 85         if(!check()) return;
 86         all=times;
 87         memcpy(ans,rec,sizeof(rec));
 88         return;
 89     }
 90     void (*cur)();
 91     if(dep==1) cur=&del1;
 92     else if(dep==2) cur=&del2;
 93     else if(dep==3) cur=&del3;
 94     else if(dep==4) cur=&del4;
 95     else if(dep==5) cur=&del5;
 96     else if(dep==6) cur=&del6;
 97     else if(dep==7) cur=&del7;
 98     else if(dep==8) cur=&del8;
 99     else if(dep==9) cur=&del9;
100     
101     siji(i,1,3) {
102         (*cur)();
103         rec[dep]=i;
104         dfs(dep+1,times+i);
105     }
106     (*cur)();
107     rec[dep]=0;
108     dfs(dep+1,times);
109 }
110 void solve() {
111     siji(i,1,3) {
112         siji(j,1,3) {
113             scanf("%d",&clo[i][j]);
114             clo[i][j]/=3;
115             --clo[i][j];
116         }
117     }
118     int cnt=0;
119     dfs(1,0);
120     siji(i,1,9) {
121         siji(j,1,ans[i]) {
122             ++cnt;
123             printf("%d%c",i," \n"[cnt==all]);
124         }
125     }
126 }
127 int main(int argc, char const *argv[])
128 {
129 #ifdef ivorysi
130     freopen("clocks.in","r",stdin);
131     freopen("clocks.out","w",stdout);
132 #else
133     freopen("f1.in","r",stdin);
134     //freopen("f1.out","w",stdout);
135 #endif
136     solve();
137     return 0;
138 }

 

 

以上是关于USACO 6.5 The Clocks的主要内容,如果未能解决你的问题,请参考以下文章

环境初始化 Build and Install the Apache Thrift IDL Compiler Install the Platform Development Tools(代码片段

poj 1166 The Clocks (暴搜)

POJ 1166 The Clocks

POJ 1166 The Clocks (暴搜)

洛谷 P1213 时钟 &&IOI 1994 The Clocks

POJ 1166 The Clocks 位运算与BFS