题目描述
考虑将如此安排在一个 3×3 行列中的九个时钟:
|-------| |-------| |-------|
| | | | | | |
|---o | |---o | | o |
| | | | | |
|-------| |-------| |-------|
A B C
|-------| |-------| |-------|
| | | | | |
| o | | o | | o |
| | | | | | | | |
|-------| |-------| |-------|
D E F
|-------| |-------| |-------|
| | | | | |
| o | | o---| | o |
| | | | | | | |
|-------| |-------| |-------|
G H I
目标要找一个最小的移动顺序将所有的指针指向 12 点。下面原表格列出了 9 种不同的旋转指针的方法,每一种方法都叫一次移动。
选择 1∼9 号移动方法,将会使在表格中对应的时钟的指针顺时针旋转 90 度。
移动方法 | 受影响的时钟 |
---|---|
1 | ABDE |
2 | ABC |
3 | BCEF |
4 | ADG |
5 | BDEFH |
6 | CFI |
7 | DEGH |
8 | GHI |
9 | EFHI |
例子:
9 9 12 9 12 12 9 12 12 12 12 12 12 12 12
6 6 6 5 -> 9 9 9 8 -> 9 9 9 4 -> 12 9 9 9 -> 12 12 12
6 3 6 6 6 6 9 9 9 12 9 9 12 12 12
但这可能不是正确的方法,请看下文。
输入格式
输入三行,每行三个正整数,表示一个时钟的初始时间,数字的含意和上面第一个例子一样。
输出格式
单独的一行包括一个用空格分开的将所有指针指向 12 点的最短移动顺序的列表。
如果有多种方案,输出那种使其连接起来的数字最小的方案。(举例来说 5 2 4 6<9 3 1 1)。
输入输出样例
输入 #1复制
9 9 12 6 6 6 6 3 6
输出 #1复制
4 5 8 9
说明/提示
题目翻译来自NOCOW。
USACO Training Section 1.4
思路:
由于任何一个操作只要进行4次,就会重复,所以每个操作最多进行3次。
有些齿轮的旋转只会与几个操作有关,只需要知道哪一个操作的次数,就可以知道这个齿轮是不是12点。
同时,操作的编码越小,操作次数也要尽量小,所以,我们可以写9重循环暴力。
Code:
#include<bits/stdc++.h>
using namespace std;
long long b[10000],a[100];
int main(){
for(int i=1;i<=9;i++){
cin>>a[i];
a[i]/=3;
}
for(int p1=0;p1<=3;p1++)
for(int p2=0;p2<=3;p2++)
for(int p3=0;p3<=3;p3++)
for(int p4=0;p4<=3;p4++)
for(int p5=0;p5<=3;p5++)
for(int p6=0;p6<=3;p6++)
for(int p7=0;p7<=3;p7++)
for(int p8=0;p8<=3;p8++)
for(int p9=0;p9<=3;p9++)
if((p1+p2+p4)%4==(4-a[1])%4&&(p1+p2+p3+p5)%4==(4-a[2])%4&&(p2+p3+p6)%4==(4-a[3])%4&&(p1+p4+p5+p7)%4==(4-a[4])%4&&(p1+p3+p5+p7+p9)%4==(4-a[5])%4&&(p3+p5+p6+p9)%4==(4-a[6])%4&&(p4+p7+p8)%4==(4-a[7])%4&&(p5+p7+p8+p9)%4==(4-a[8])%4&&(p6+p8+p9)%4==(4-a[9])%4){
b[1]=p1;
b[2]=p2;
b[3]=p3;
b[4]=p4;
b[5]=p5;
b[6]=p6;
b[7]=p7;
b[8]=p8;
b[9]=p9;
for(int i=1;i<=9;i++)
if(b[i])
for(int j=1;j<=b[i];j++)
cout<<i<<" ";
return 0;
}
}