摘要: 给定三种操作,将排列A转化为排列B,求最少步骤。 这种题目可以只跑一次bfs,比如只跑"12345678",那么如果遇到"23456781"->某个字符串呢?因为每一个数字都是等价的,我们可以把2映射为1,3映射成2,以此类推。这样就可以用"12345678"跑出来的操作序列了。 阅读全文
posted @ 2018-02-08 23:04 Luke_Ye 阅读(195) 评论(0) 推荐(0) 编辑
摘要: 因为是计算还原成一种局面的最短步骤,应该想到从最终局面开始做bfs,把所有能到达的情况遍历一遍,把值存下来。 bfs过程中,访问过的局面的记录是此题的关键,9*9的方格在计算过程中直接存储非常占内存。而这个显然是12345678x的不同排列,考虑康拓展开来记录,每个局面hash成一个整数。步骤我先算 阅读全文
posted @ 2018-02-08 22:08 Luke_Ye 阅读(209) 评论(0) 推荐(0) 编辑
摘要: 对于一个集合内所有元素的排列,康拓展开是一个无冲突的hash法。其规则便是将排列在逻辑上排好序,然后每个排列的序号即是hash值。 关键就在如何快速求出序号和快速还原啦。 首先我们确定一好集合内各元素的大小关系,然后开始处理。 生成: 对于一个排列(长度为n),我们要算出它前面有多少比它小的序列,如 阅读全文
posted @ 2018-02-08 22:03 Luke_Ye 阅读(316) 评论(0) 推荐(0) 编辑