-
总时间限制:
- 1000ms 内存限制:
- 65536kB
-
描述
-
有9个时钟,排成一个3*3的矩阵。
移动 影响的时钟
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 }