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;
}

最新文章

  1. Kafka 如何读取offset topic内容 (__consumer_offsets)
  2. An entity object cannot be referenced by multiple instances of IEntityChangeTracker 的解决方案
  3. 【Android】神奇的android:clipChildren属性
  4. 【BZOJ-1858】序列操作 线段树
  5. Yii2 数据操作Query Builder(转)
  6. linux 安装eclipse 和cdt
  7. android linker (1) —— __linker_init()
  8. java操作xm——添加、修改、删除、遍历
  9. 传智springMVC笔记
  10. Zend Framework 入门(4)—页面布局
  11. oc学习之路----代理模式
  12. Git使用过程
  13. VBA 中窗体模式切换,一次设计2种表现
  14. Entity Framework Core 懒加载
  15. 跑步“无核心,不PB”
  16. Thinkphp框架 表单自动验证登录注册 ajax自动验证登录注册
  17. oracle的存储过程
  18. asp.net gridview 如何实现行点击事件
  19. [转]Nginx负载均衡原理初解
  20. 1062 Talent and Virtue (25 分)

热门文章

  1. 一个文件系统过滤驱动的demo
  2. CF 577A 分解因数
  3. C++拾遗——重新开始
  4. Azkaban(三)Azkaban的使用
  5. mysql远程访问 登录ERROR 1130: is not allowed to connect to this MySQL server解决办法
  6. 【LOJ】 #2540. 「PKUWC2018」随机算法
  7. [HDU - 5408] CRB and Farm
  8. Entity Framework Core 入门(2)
  9. [leetcode DP]64. Minimum Path Sum
  10. C# NPOCO 轻量级ORM框架(入门)