OpenJ_Bailian 2814 拨钟问题
- 总时间限制:
- 1000ms
- 内存限制:
- 65536kB
- 描述
-
有9个时钟,排成一个3*3的矩阵。
|-------| |-------| |-------|
| | | | | | |
|---O | |---O | | O |
| | | | | |
|-------| |-------| |-------|
A B C
|-------| |-------| |-------|
| | | | | |
| O | | O | | O |
| | | | | | | | |
|-------| |-------| |-------|
D E F
|-------| |-------| |-------|
| | | | | |
| O | | O---| | O |
| | | | | | | |
|-------| |-------| |-------|
G H I
(图 1)现在需要用最少的移动,将9个时钟的指针都拨到12点的位置。共允许有9种不同的移动。如下表所示,每个移动会将若干个时钟的指针沿顺时针方向拨动90度。
移动 影响的时钟
1 ABDE
2 ABC
3 BCEF
4 ADG
5 BDEFH
6 CFI
7 DEGH
8 GHI
9 EFHI - 输入
- 9个整数,表示各时钟指针的起始位置,相邻两个整数之间用单个空格隔开。其中,0=12点、1=3点、2=6点、3=9点。
- 输出
- 输出一个最短的移动序列,使得9个时钟的指针都指向12点。按照移动的序号从小到大输出结果。相邻两个整数之间用单个空格隔开。
- 样例输入
-
3 3 0 2 2 2 2 1 2
- 样例输出
-
4 5 8 9
解题思路:9重循环枚举1 #include <iostream> 2 3 using namespace std; 4 5 6 int main() 7 { 8 int clock[10]; 9 for (int i = 1; i <= 9; ++i) 10 cin >> clock[i]; 11 12 int minCnt = 100; //保存拨动的最小次数 13 int i1, i2, i3, i4, i5, i6, i7, i8, i9; 14 int result[10]; 15 for (i1 = 0; i1 <= 3; ++i1) 16 for (i2 = 0; i2 <= 3; ++i2) 17 for (i3 = 0; i3 <= 3; ++i3) 18 for (i4 = 0; i4 <= 3; ++i4) 19 for (i5 = 0; i5 <= 3; ++i5) 20 for (i6 = 0; i6 <= 3; ++i6) 21 for (i7 = 0; i7 <= 3; ++i7) 22 for (i8 = 0; i8 <= 3; ++i8) 23 for (i9 = 0; i9 <= 3; ++i9) 24 { 25 if ((i1 + i2 + i4 + clock[1]) % 4 == 0 && 26 (i1 + i2 + i3 + i5 + clock[2]) % 4 == 0 && 27 (i2 + i3 + i6 + clock[3]) % 4 == 0 && 28 (i1 + i4 + i5 + i7 + clock[4]) % 4 == 0 && 29 (i1 + i3 + i5 + i7 + i9 + clock[5]) % 4 == 0 && 30 (i3 + i5 + i6 + i9 + clock[6]) % 4 == 0 && 31 (i4 + i7 + i8 + clock[7]) % 4 == 0 && 32 (i5 + i7 + i8 + i9 + clock[8]) % 4 == 0 && 33 (i6 + i8 + i9 + clock[9]) % 4 == 0) 34 { 35 int sum = i1 + i2 + i3 + i4 + i5 + i6 + i7 + i8 + i9; 36 if (sum < minCnt) //如果当前拨动的次数小于最小拨动次数 37 { 38 minCnt = sum; 39 result[1] = i1; 40 result[2] = i2; 41 result[3] = i3; 42 result[4] = i4; 43 result[5] = i5; 44 result[6] = i6; 45 result[7] = i7; 46 result[8] = i8; 47 result[9] = i9; 48 } 49 } 50 } 51 52 for (int i = 1; i <= 9; ++i) 53 for (int j = 1; j <= result[i]; ++j) 54 cout << i << ' '; 55 56 return 0; 57 }