十一、回溯法框架

1. n皇后问题

procedure try(i:byte);
var j:byte;
begin
  if i=n+1 then begin print;exit;end;
    for j:=1 to n do
      if a[i] and b[j+i] and c[j-i] then begin
        x[i]:=j;
     a[j]:=false; b[j+i]:=false; c[j-i]:=false;
     try(i+1);
     a[j]:=true; b[i+j]:=true; c[j-i]:=true;
   end;
end;

2.Hanoi Tower  汉诺塔

h(n)=2*h(n-1)+1
h(1)=1
初始所有铜片都在a柱上
procedure hanoi(n,a,b,c:byte); {将第n块铜片从a柱通过b柱移到c柱上}
begin
   if n=0 then exit;
   hanoi(n-1,a,c,b); {将上面的n-1块从a柱通过c柱移到b柱上}
   write(n,’moved from’,a,’to’,c);
   hanoi(n-1,b,a,c);{ 将b上的n-1块从b柱通过a柱移到c柱上
end;

初始铜片分布在3个柱上,给定目标柱goal
h[1..3,0..n]存放三个柱的状态,now与nowp存最大的不到位的铜片的柱号和编号,h[I,0]存第I个柱上的个数。

Procedure move(k,goal:integer); {将最大不到位的k移到目标柱goal上}
Begin
If k=0 then exit;
For I:=1 to 3 do
  For j:=1 to han[I,0] do
   If h[I,j]=k then begin now:=I;nowp:=j; end; {找到k的位置}
If now<>goal then begin  {若未移到目标}
  Move(k-1,6-now-goal);  {剩下的先移到没用的柱上}
  Writeln(k moved from now to goal);
  H[goal,h[goal,0]+1]:=h[now,nowp]; h[now,nowp]:=0;
  Inc(h[goal,0]); dec(h[now,0]);
  Move(k-1,goal); {剩下的移到目标上}
End;

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值