`
leonluchen
  • 浏览: 30356 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

USACO Section 1.4.2 [The Clocks] Java题解

阅读更多
题意分析:
有编号为A-I的9个时钟,时钟只有指向3、6、9、12四种状态,一次转动只能顺时针转90度,已知9种转动方式,每种转动方式指定不同的几个钟顺时针转90度,要使所有钟都回到12点,根据不同的输入,要如何组合这9种转动方式呢?找出最短序列,同样长度的情况下以序列编号小为先。

解题思路1:
某一种转动方式若使用4次即没使用。因此1-9每一种转动方式至多使用4次,因此9种转动方式最多产生4(enum 0...3)^9=262144个序列,使用dfs完全遍历也不会超时。保存每次产生的有效序列结果,全部遍历完成后,按序列长度和数字大小排序,输出第一个结果。
代码实现1:
https://github.com/leonlu/USACOJavaSolution/blob/master/USACOSection1/src/clocks.java

解题思路2:
有以下改进余地:
1)产生序列时,可先尽量多得产生标号小的。每次标号产生完毕后,检查序列长度以及有效性,若序列较短则替换原有的长度及序列。
2)时钟的状态不需要每次重新算,可以作为搜索的状态跟着跑。
代码实现2:
https://github.com/leonlu/USACOJavaSolution/blob/master/USACOSection1/src/clocks_refined.java

本题的数据比较弱,细节上有失误也许也会过。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics