正文

北大poj 1166 The Clocks解题报告源代码2009-10-22 19:37:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/shao/49706.html

分享到:

 

 

北大poj 1166 The Clocks解题报告源代码


作者:贾晔

The Clocks

9只钟表排成3*3的方阵,每只钟表只能指向上、下、左、右四个位置
9种作用方式,每种使一些钟表的指针右转90°
使用这9种作用,使得所有钟表都指向正上方 (记为状态0)
求使得总作用次数最少的策略

Sample

 

Input Data
3*3矩阵,元素为0,1,2或3,分别表示钟表指向上,右,下,左

 


钟表矩阵的有限性
由于矩阵结构及其元素取值范围相当有限,故可能出现的钟表矩阵也是很有限的,即4^9=262144种
由此有限性可以考虑搜索解法

广度优先搜索
从状态0开始搜索
搜索过程:标记可以通过一次作用达到此状态的所有状态为已搜索,然后搜索新标记的状态。搜索过程中保存使用的作用方式
每个状态用一个32位整数的低18位表示,可将结果存在长度为262144的数组中

 

启发
广度优先搜索的可行意味着作用次数的相当有限
注意到作用的结果与作用的顺序无关,则显然每种作用最多只需使用3次
于是,问题简化为求解同余方程组

同余方程组
把钟表和作用分别从1到9标号,则同余方程组可写为
[C(i) +∑E(i,j) * M (j)] mod 4= 0 (i=1..9)
其中C(i),M(j),E(i,j)分别表示第i个钟表的初始状态,第j种作用的次数,第j种作用是否拨动第i个钟表

写成矩阵的形式
            ( C + E M ) mod 4 = 0          (*)
  我们所求为M的最小非负解M0=M mod 4
显然,当k足够大时,方程
               C + E M’ = 4 * k
   的解也是 (*) 式的解,故
                 M0 =M’ mod 4
由于E是与输入无关的系数矩阵,所以我们可以事先求出其逆矩阵E  ,则M  可以写成
         M  =( E   ( 4 * k – C ) ) mod 4
这样,我们只需用另一段程序求出E  ,问题就可以在O(1)的时空内解决。

 

http://www.608088.com/show-57-1.html

阅读(3291) | 评论(1)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册