为防止广告,目前nocow只有登录用户能够创建新页面。如要创建页面请先登录/注册(新用户需要等待1个小时才能正常使用该功能)。

USACO/msquare

来自NOCOW
跳转到: 导航, 搜索

[编辑] 分析

宽搜,状态数 8! 不大。

判重用hash(如果RP较好你可以不用),

康托展开

或者使用8位16进制展开(相当于32位2进制),用longword或qword就可以表示。

怎么开散列就随便了。

--By Tsc13579

把8表示成0,每3个二进制位可以存储一个数字,总共2^24种,考虑到每1~8都会出现,知道前7个数时最后个数也已经被确定,只需要将用来表示状态的二进制右移3位,达到2^21,空间就没问题了。

--By BillWSY

因为8个数是确定的,其实用一个七维数组就可以判重了,flag[1..8,1..8,1..8,1..8,1..8,1..8,1..8] of boolean

如上使用数组判重是个好方法,用hash太复杂啦!!!不过注意,如果是C的话,要用short int,否则会超过usaco内存限制。

--By mamsds

--By MZD

宽搜+全排列编码判重 空间复杂度 40320*(8+2+1) --By txyx


告诉大家怎么用哈希把: 1、只用七位就够了,因为第八位是确定的。 2、由于是不重复的,可以生产8的全排列,再new(f[.........]); 这样总共只用了7!=5040的空间。

具体见pascal代码5. --by czz5242199

另:dfs-id估计很难过...

简单的bfs+hash,hash时记录7位,用八进制存,内存足够,不需要另外hash了。注意初始状态12345678的情况。 --yuhc

dfs-id我过了,详见代码 --sxpeter

如果没限制,c++的用map可以,但是学oi的就不要想了。(搞acm可以用这个偷一下懒,但还是建议用康托,或位进制hash) //oier 们也可以用 map --an oier

7位hash没问题,但是空间仍是8!=40320,而不是7!=5040.因为如果空间是7!的话,那么排列1234567和1234568将算作一个排列,重复了,所以一定会错. 另外,如果使用Contor展开的话,必须是8位,因为Contor展开是基于全排列的.

--by Climber.pI


For those who have very big RP,BiDrection-BFS+hash is good.

---Saint Crow

输出其实根本不用判断60个字符一行,因为BFS到22层就已经有了40316左右中情况,接近全部的40320。所以即使再强的数据也不会到达60步。 ---By XZ


当用C++的STL用多了之后 就会发现STL的存在,完全对C党和PAS党不公平! 非常不公平。。。

说下用STL的做法。

用std::queue 直接保存node(状态,翻转过程,深度)

用std::set<string> 判断重复

用std::string 保存状态

这题完全就是水题 标准BFS 完全没有任何技巧。。。

详情观察C++代码 ID:STL无敌

[编辑] 参考代码

C

C++

Pascal

Java

[编辑] 引用

[1]

[2]

个人工具