舞蹈链java实现_舞蹈链(DLX) - osc_kpp7htz3的个人空间 - OSCHINA - 中文开源技术交流社区...

#舞蹈链(DLX) Tags:搜索 ##作业部落 ##评论地址

##一、概述 特别特别感谢这位童鞋His blog 舞蹈链是一种优美的搜索,就像下面这样跳舞~

649530af257ccf1c0973a14c08f9420b684.jpg

5a263dc42fba0de5677c782e96c8dfbd49d.jpg

4d916fd014ce71d37d37321c4cb56a22803.jpg 舞蹈链用于解决精确覆盖或者重复覆盖的问题 你可以想象成贪吃蛇的一个上下左右联通的地图 $Dancing Links$就是通过链表这样实现的 网上有图的博客

##二、实现 ####更详细的讲解在课件中 ###精确覆盖 精确覆盖大概指的就是数独和八皇后那样的问题 矩阵中选择一个行的集合,使得每列有且只有一个1 那么就是说每个格子上的点都有若干限制条件(行、列、对角线),每个条件都只允许一个元素 在舞蹈链中(可以把它看作一个表格),每个元素看作一行,限制条件转化为列,选一行删去也同时要删去这一行中所有点所在的列 然后舞蹈链兹瓷快速删除这些东西和快速回溯(复杂度未知) 大概有$init$、$link$、$remove$、$resume$、$dance$五个函数 实现的话看代码吧,有详细的注释 ###Code - [luogu1219]八皇后

#include

#include

#include

#include

using namespace std;

const int N=100100;

int ans,nn,o;

struct out{int a[14];}Ans[N];

namespace DLX

{

int n,m,cnt;//长宽,点的数量

int l[N],r[N],u[N],d[N];//上下左右的情况

int row[N],col[N];//每个点所处的行列

int h[N],s[N];//头节点和每列节点数

int ansk[20];//答案

void init(int nn,int mm)

{

//这个表格被循环套了起来,就像贪吃蛇的地图,左右和上下相通

//预先给第0行的每一列弄一个点

n=nn,m=mm;

for(int i=0;i<=m;i++)

r[i]=i+1,l[i]=i

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值