拨钟问题

拨钟问题

总时间限制: 
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 帮助 关于

 

posted @ 2022-06-14 18:02  AD2017  阅读(40)  评论(0)    收藏  举报