题目描述
考虑将如此安排在一个 3 x3 行列中的九个时钟:
|——-| |——-| |——-|
| | | | | | |
|—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
Example
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
[但这可能不是正确的方法,请看下面]
PROGRAM NAME: clocks
INPUT FORMAT
第1-3行: 三个空格分开的数字,每个数字表示一个时钟的初始时间,3,6,9,12。
数字的含意和上面第一个例子一样。
SAMPLE INPUT (file clocks.in)
9 9 12
6 6 6
6 3 6
OUTPUT FORMAT
单独的一行包括一个用空格分开的将所有指针指向12:00的最短移动顺序的列表。
如果有多种方案,输出那种使的连接起来数字最小的方案。(举例来说5 2 4 6 < 9 3 1 1)。
SAMPLE OUTPUT (file clocks.out)
4 5 8 9
输入
输出
样例输入
样例输出
数据范围限制
网上说这是IOI真题,哇哦
的确这题很经典
不过先说,宽搜A不了这题
调试一整晚的我一怒之下弃坑去码暴力
思路:
明显地,每个操作最多转三下:0下,1下,2下,3下,转四下就转回来了,没用
那么我们直接暴力9个循环(啧),4^9=262144,时间上过的去
wait暴力?好像有点问题
(好吧)一点问题也没有
你的操作一定是升序的,这个不用我再说了吧?
你怎么调换转的顺序,结果出来都一样,按照题目就输出升序的(最小的)
还有一个好搞的地方就是,每个东东div 3会好弄一点、好看一点
还有一个优化是最重要的(不搞这优化A不了你信吗)
直接改变超时无疑,so就得在最里面一层循环中优化
方法是在里面再用俩循环来剔掉没用方案
第一层循环是每一个钟的状态
第二层循环是枚举方案的每一种
如果方案操作后当前这个钟不指向12
这种方案就不行了
后面几个钟就不用再操作了
哦对了,这种方法找到的第一种一定最小