题目:Bridged Marble Rings
链接:http://acm.hdu.edu.cn/showproblem.php?pid=2174
题意:如图,要把所有灰色球移动到上圈,每次操作可以转图中虚线圈起的三个圆,求中间圆的最少转数。题目给出的是字符串,g代表灰色球,y代表黄色球,起始位置看标记。
思路:
BFS打表+最小表示法
令g=1,y=0,用int 表示当前状态。
最开始直接用BFS打表,超时超内存,按我最初的算法,所有状态总数为C(26,13)约等于1000多万种。但实际上,因为转动上下两个圈是不增加转数的,所以很多情况是等价的,可以压缩状态数,对于一个状态S,可以转动上圈,下圈使其得到最小表示的状态T。接着存T就可以了。每次,注意,map会超时,后面我改成哈希就过了。。。
具体:每次出队一个状态,将该状态对应的13*13个下一步状态(筛选一下)入队。
AC代码:
1 #include
2 #include