拨钟问题
拨钟问题
- 总时间限制:
- 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
- 来源
#include <iostream> using namespace std; int main() { int s; int in[9]; for (int i = 0; i < 9; i++) { cin >> s; in[i] = s; } int sum, min = 1000; int ret[9] = {0}; for (int i0 = 0; i0 < 4; i0++) for (int i1 = 0; i1 < 4; i1++) for (int i2 = 0; i2 < 4; i2++) for (int i3 = 0; i3 < 4; i3++) for (int i4 = 0; i4 < 4; i4++) for (int i5 = 0; i5 < 4; i5++) for (int i6 = 0; i6 < 4; i6++) for (int i7 = 0; i7 < 4; i7++) for (int i8 = 0; i8 < 4; i8++) { if ((i0 + i1 + i3 + in[0]) % 4 == 0 && (i0 + i1 + i2 + i4 + in[1]) % 4 == 0 && (i1 + i2 + i5 + in[2]) % 4 == 0 && (i0 + i3 + i4 + i6 + in[3]) % 4 == 0 && (i0 + i2 + i4 + i6 + i8 + in[4]) % 4 == 0 && (i8 + i5 + i2 + i4 + in[5]) % 4 == 0 && (i3 + i6 + i7 + in[6]) % 4 == 0 && (i8 + i7 + i6 + i4 + in[7]) % 4 == 0 && (i8 + i7 + i5 + in[8]) % 4 == 0) { sum = i0 + i1 + i2 + i3 + i4 + i5 + i6 + i7 + i8; if (sum < min) { min = sum; ret[0] = i0; ret[1] = i1; ret[2] = i2; ret[3] = i3; ret[4] = i4; ret[5] = i5; ret[6] = i6; ret[7] = i7; ret[8] = i8; } } } for (int i = 0; i < 9; i++) { for (int j = 0; j < ret[i]; j++) { if (i == 8 && j == ret[i] - 1) { cout << i + 1; break; } cout << i + 1 << " "; } } return 0; } 基本信息 #: 34271991 题目: 002 提交人: AD2017 内存: 248kB 时间: 2ms 语言: G++ 提交时间: 2022-05-04 10:51:53 ©2002-2021 POJ 京ICP备20010980号-1 English 帮助 关于