Dancing Links学习:http://www.cnblogs.com/steady/archive/2011/03/15/1984791.html

以及图文学习:http://www.cnblogs.com/grenet/p/3145800.html

思路:这题是Dancing Links即DLX的最简单题目了吧,看懂了这个知识点之后。也不想自己敲了。然后搜索了好多个代码模板。认为这个我比較好理解也比較好掌握。然后就用这个模板了。

#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
#define MAXN 350*30+30
#define INF 0xFFFFFF
int head,sz;
int U[MAXN],D[MAXN],L[MAXN],R[MAXN];//上下左右链表指针
int H[MAXN],ROW[MAXN],C[MAXN],S[MAXN],O[MAXN];
void remove(int c)
{
L[R[c]]=L[c];
R[L[c]]=R[c];
for(int i=D[c]; i!=c; i=D[i])
{
for(int j=R[i]; j!=i; j=R[j])
{
U[D[j]]=U[j];
D[U[j]]=D[j];
--S[C[j]];
}
}
}
void resume(int c)
{
for(int i=U[c]; i!=c; i=U[i])
{
for(int j=L[i]; j!=i; j=L[j])
{
++S[C[j]];
U[D[j]]=j;
D[U[j]]=j;
}
}
L[R[c]]=c;
R[L[c]]=c;
}
bool dfs(int k)
{
if(R[head]==head)
return true;
int s=INF,c;
for (int t=R[head]; t!=head; t=R[t])
if (S[t]<s) s=S[t],c=t;
remove(c);
for(int i=D[c]; i!=c; i=D[i])
{
O[k]=ROW[i];
for(int j=R[i]; j!=i; j=R[j])
remove(C[j]);
if(dfs(k+1)) return true;
for(int j=L[i]; j!=i; j=L[j])
resume(C[j]);
}
resume(c);
return false;
}
void init(int m)//m是列
{
head=0;//头指针为0
for(int i=0; i<=m; i++)
{
U[i]=i;
D[i]=i;//建立双向十字链表
L[i]=i-1;
R[i]=i+1;
S[i]=0;
}
R[m]=0;
L[0]=m;
S[0]=INF+1;
sz=m+1;
memset(H,0,sizeof(H));
}
void insert(int i, int j)
{
if(H[i])
{
L[sz] = L[H[i]];
R[sz] = H[i];
L[R[sz]] = sz;
R[L[sz]] = sz;
}
else
{
L[sz] = sz;
R[sz] = sz;
H[i] = sz;
}
U[sz] = U[j];
D[sz] = j;
U[D[sz]] = sz;
D[U[sz]] = sz;
C[sz] = j;
ROW[sz] = i;
++S[j];
++sz;
}
int main()
{
//freopen("1.txt","r",stdin);
int n,m,x;
while(~scanf("%d%d",&n,&m))
{
init(m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
scanf("%d",&x);
if(x) insert(i,j);
}
if(dfs(0)) //从头指针0開始遍历
puts("Yes, I found it");
else puts("It is impossible");
}
return 0;
}

POJ 3740 Dancing Links的更多相关文章

  1. poj 3740 Easy Finding(Dancing Links)

    Easy Finding Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 15668   Accepted: 4163 Des ...

  2. POJ 3074 Sudoku (Dancing Links)

    传送门:http://poj.org/problem?id=3074 DLX 数独的9*9的模板题. 具体建模详见下面这篇论文.其中9*9的数独怎么转化到精确覆盖问题,以及相关矩阵行列的定义都在下文中 ...

  3. POJ 3076 Sudoku (dancing links)

    题目大意: 16*16的数独. 思路分析: 多说无益. 想说的就是dancing links 的行是依照 第一行第一列填 1 第一行第二列填 2 -- 第一行第十五列填15 第一行第二列填 1 -- ...

  4. poj 3074 Sudoku(Dancing Links)

    Sudoku Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8152   Accepted: 2862 Descriptio ...

  5. 【POJ 3740】 Easy Finding

    [题目链接] http://poj.org/problem?id=3740 [算法] Dancing Links算法解精确覆盖问题 详见这篇文章 : https://www.cnblogs.com/g ...

  6. Dancing Links 学习笔记

    Dancing Links 本周的AI引论作业布置了一道数独 加了奇怪剪枝仍然TLE的Candy?不得不去学了dlx dlxnb! Exact cover 设全集X,X的若干子集的集合为S.精确覆盖是 ...

  7. Easy Finding POJ - 3740 (DLX)

    显然这是一道dfs简单题 或许匹配也能做 然而用了dancing links 显然这也是一道模板题 好的吧 调了一上午 终于弄好了模板 Easy Finding Time Limit: 1000MS ...

  8. POJ3074 Sudoku —— Dancing Links 精确覆盖

    题目链接:http://poj.org/problem?id=3074 Sudoku Time Limit: 1000MS   Memory Limit: 65536K Total Submissio ...

  9. Dancing Links and Exact Cover

    1. Exact Cover Problem DLX是用来解决精确覆盖问题行之有效的算法. 在讲解DLX之前,我们先了解一下什么是精确覆盖问题(Exact Cover Problem)? 1.1 Po ...

随机推荐

  1. 《HBase实战》学习笔记

    第二章  入门 HBase写路径: 增加新行和修改已有的行,内部机制是一样的. 写入的时候,会写到预写日志(WAL)和MemStore中. MenmStore是内存里的写入缓冲区.填满后,会将数据刷写 ...

  2. glBlendFunc的几种常用情况

    先Mark一下,后面有时间补上DEMO 1.画航母大灯,手电筒(效果为:透过黑色半透明层可看到下面的背景图,仅圆圈部分) 1)先画圆圈 2)再画背景图(大背景) 大背景设置  glBlendFunc ...

  3. explicit 显示的类型转换运算符

    C++提供了关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生.声明为explicit的构造函数不能在隐式转换中使用. 调用构造函数可以分为显示调用和隐式调用,当用赋值初 ...

  4. [leetcode tree]102. Binary Tree Level Order Traversal

    Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...

  5. HAproxy 代理技术原理探究

    HAproxy 技术分享 简介 HAProxy是一款提供高可用性.负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件 Features 1.免费 2.能够做到4层以上代理 3.高性能 ...

  6. 决策树(CART)

    CART算法全称是分类回归算法,(Classification And Regression Tree),他与ID3.C4.5的不同在于: 1.既可以处理分类问题又可以处理回归问题 2.使用基尼系数作 ...

  7. 第一个ASP.NET MVC应用程序

    首先打开vs2015 文件->新建->项目 选择模版选empty,下面[为下项添加文件夹和核心引用]勾选mvc 点击确定就好

  8. 【CF540D】 D. Bad Luck Island (概率DP)

    D. Bad Luck Island time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  9. Java实现杨辉三角形

    Java实现杨辉三角形 一.源代码:YFTriangle.java package cn.com.zfc.day009; import java.util.Scanner; /** * 打印杨辉三角形 ...

  10. java集合之一(框架介绍)

    本文转载自:http://www.cnblogs.com/skywang12345/p/3308498.html Java集合主要可以划分为4个部分:List列表.Set集合.Map映射.工具类(It ...