Loading

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 }

 

 
posted @ 2019-02-22 11:11  拾月凄辰  阅读(324)  评论(0编辑  收藏  举报