第一周 枚举:2.拨钟问题

总时间限制:
1000ms
内存限制:
65536kB
描述

有9个时钟,排成一个3*3的矩阵。

现在需要用最少的移动,将9个时钟的指针都拨到12点的位置。共允许有9种不同的移动。如下表所示,每个移动会将若干个时钟的指针沿顺时针方向拨动90度。


移动    影响的时钟

1 ABDE
2 ABC
3 BCEF
4 ADG
5 BDEFH
6 CFI
7 DEGH
8 GHI
9 EFHI
(图 2)
输入
从标准输入设备读入9个整数,表示各时钟指针的起始位置。0=12点、1=3点、2=6点、3=9点。
输出
输出一个最短的移动序列,使得9个时钟的指针都指向12点。按照移动的序号大小,输出结果。
样例输入
3 3 0 
2 2 2 
2 1 2 
样例输出
4 5 8 9 
  1 #include <iostream>
  2 #include <cstdio>
  3 using namespace std;
  4 int state[5][5] = {0};
  5 int s[5][5] = {0};
  6 int swit[5][5] = {0};
  7 int cop[5][5] = {0};
  8 int sum = 0;
  9 int mi = 100;
 10  
 11 void changeswit(int a, int b, int t)
 12 {
 13     int no = (a - 1) * 3 + b;
 14     if(b == 2 && a != 2)
 15     {
 16         state[a][b - 1] = (state[a][b - 1] + t) % 4;
 17         state[a][b] = (state[a][b] + t) % 4;
 18         state[a][b + 1] = (state[a][b + 1] + t) % 4;
 19     }
 20     else if(a == 2 && b != 2)
 21     {
 22         state[a - 1][b] = (state[a - 1][b] + t) % 4;
 23         state[a][b] = (state[a][b] + t) % 4;
 24         state[a + 1][b] = (state[a + 1][b] + t) % 4;
 25     }
 26     else if(a == 2 && b == 2)
 27     {
 28         state[a][b] = (state[a][b] + t) % 4;
 29         state[a - 1][b] = (state[a - 1][b] + t) % 4;
 30         state[a + 1][b] = (state[a + 1][b] + t) % 4;
 31         state[a][b - 1] = (state[a][b - 1] + t) % 4;
 32         state[a][b + 1] = (state[a][b + 1] + t) % 4;
 33     }
 34     else
 35     {
 36         int dx[3] = {-1, 0, 1};
 37         int dy[3] = {-1, 0, 1};
 38         for(int i = 0; i < 3; i++)
 39             for(int j = 0; j < 3; j++)
 40                 state[a+dx[i]][b+dy[j]] = (state[a+dx[i]][b+dy[j]] + t) % 4;
 41     }
 42     return;
 43  
 44 }
 45  
 46  
 47 int main()
 48 {
 49     for(int i = 1; i <= 3; i++)
 50         for(int j = 1; j <= 3; j++)
 51             scanf("%d",&s[i][j]);
 52     for(int i = 0; i < 4; i++)
 53     {
 54         for(int j = 0; j < 4; j++)
 55         {
 56             for(int k = 0; k < 4; k++)
 57             {
 58                 for(int l = 1; l < 4; l++)
 59                     for(int m = 1; m < 4; m++)
 60                     {
 61                         state[l][m] = s[l][m];
 62                         swit[l][m] = 0;
 63                     }
 64                 sum = 0;
 65  
 66                 swit[1][1] = i;
 67                 swit[1][2] = j;
 68                 swit[1][3] = k;
 69                 changeswit(1,1,i);
 70                 changeswit(1,2,j);
 71                 changeswit(1,3,k);
 72  
 73                 if(state[1][1] != 0)
 74                 {
 75                     swit[2][1] = 4 - state[1][1];
 76                     changeswit(2,1,4 - state[1][1]);
 77                 }
 78                 if(state[1][3] != 0)
 79                 {
 80                     swit[2][3] = 4 - state[1][3];
 81                     changeswit(2,3,4 - state[1][3]);
 82                 }
 83                 if(state[1][2] != 0)
 84                 {
 85                     swit[2][2] = 4 - state[1][2];
 86                     changeswit(2,2,4 - state[1][2]);
 87                 }
 88                 if(state[2][1] != 0)
 89                 {
 90                     swit[3][1] = 4 - state[2][1];
 91                     changeswit(3,1,4 - state[2][1]);
 92                 }
 93                 if(state[2][3] != 0)
 94                 {
 95                     swit[3][3] = 4 - state[2][3];
 96                     changeswit(3,3,4 - state[2][3]);
 97                 }
 98                 if(state[2][2] != 0) continue;
 99                 if(state[3][1] == state[3][2] && state[3][1] == state[3][3])
100                 {
101                     swit[3][2] = (4 - state[3][1]) % 4;
102                     for(int l = 1; l < 4; l++)
103                         for(int m = 1; m < 4; m++)
104                             sum += swit[l][m];
105                     if(sum < mi)
106                     {
107                         mi = sum;
108                         for(int l = 1; l < 4; l++)
109                             for(int m = 1; m < 4; m++)
110                                 cop[l][m] = swit[l][m];
111                     }
112                 }
113                 else continue;
114             }
115         }
116     }
117     bool f = 0;
118     for(int i = 1; i < 4; i++)
119         for(int j = 1; j < 4; j++)
120         {
121             while(cop[i][j]--)
122             {
123                 if(f) printf(" ");
124                 printf("%d", 3*(i - 1) + j);
125                 f = 1;
126             }
127         }
128     printf("\n");
129     return 0;
130 }

 

posted @ 2015-05-19 12:04  慕课教育MOOC  阅读(1351)  评论(0编辑  收藏  举报