Dancing Links 模板

本文详细解析了Dancinglinks算法的实现过程,通过使用Pascal语言编写并展示了算法的核心逻辑。文章同时提供了C语言版本的实现代码,帮助读者深入理解算法的运行机制和优化细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

终于搞清楚了Dancing links是怎么写的了,并用P和C各写了一遍

program poj_3740;
var
  l,r,u,d,ch:array[0..10000]of longint;
  lin,col,size,o:array[0..1000]of longint;
  mx,bj,st,i,j,m,n,x,head:longint;
procedure origin(n,m:longint);
begin
  for i:=1 to m do begin
    l[i]:=i-1; r[i]:=i+1; u[i]:=i; d[i]:=i;
  end; l[0]:=n; r[0]:=1; r[m]:=0;
  for i:=1 to n do begin
    l[m+i]:=m+i; r[m+i]:=m+i;
  end; st:=m+n;
end;
procedure link(x,y,xx,yy:longint);
begin
  inc(st); lin[st]:=x; col[st]:=y;
  l[st]:=l[x]; r[st]:=x;  l[r[st]]:=st; r[l[st]]:=st;
  u[st]:=u[y]; d[st]:=y;  u[d[st]]:=st; d[u[st]]:=st;
  inc(size[y]);
end;
procedure init;
begin
  origin(n,m);
  for i:=1 to n do
    for j:=1 to m do begin
      read(x);
      if x=1 then link(i+m,j,i,j);
    end;
end;
procedure remove(c:longint);
begin if c=0 then exit;
  l[r[c]]:=l[c]; r[l[c]]:=r[c];
  i:=d[c];while i<>c do begin
    j:=r[i];while j<>i do begin
      u[d[j]]:=u[j];
      d[u[j]]:=d[j];
      dec(size[col[j]]);
    j:=r[j];end;
  i:=d[i];end;
end;
procedure resume(c:longint);
begin
  l[r[c]]:=c; r[l[c]]:=c;
  i:=d[c];while i<>c do begin
    j:=r[i];while j<>i do begin
      inc(size[col[j]]);
      d[u[j]]:=j;
      u[d[j]]:=j;
    j:=r[j];end;
  i:=d[i];end;
end;
function dfs(k:integer):boolean;
var ss:integer=maxint; i,j,c:integer;
begin
  if r[head]=head then exit(true);
  i:=r[head];c:=head;while i<>head do begin
    if size[i]<ss then begin ss:=size[i]; c:=i; end;
  i:=r[i]; end;
  remove(c);
  i:=d[c];while i<>c do begin
    o[k]:=i; //len:=k;
    j:=r[i];while j<>i do begin
      remove(col[j]);
    j:=r[j]; end;
    if dfs(k+1) then exit(true);
    j:=l[i];while j<>i do begin
      resume(col[j]);
    j:=l[j];end;
  i:=d[i];end;
  resume(c);
  exit;
end;
begin
  while not eof do begin
    readln(m,n);
    init;
    if dfs(0) then writeln('Find') else writeln('unfind');
  end;
end.


这是PASCAL的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值