非递归解决组合问题
//非遞歸搜索回溯框架
dep:=1;//搜索起點,深度為1
repeat
?? ?while g[dep]<=搜索方案數 do//能進則進
?? ?begin
?? ??? ?inc(g[dep]);//取前進方案
?? ??? ?if 不符條件 then continue;
?? ??? ?if dep=步數或達到終點條件 then print
?? ??? ?else inc(dep);?? ??? ?
?? ?end;
???
?? ?g[dep]:=0;
dec(dep);//回溯,恢復狀態
until dep=0;//回溯到起點之前時結束搜索
?
begin
?? ?readln(n,r);
?? ?dep:=1;//搜索起點,深度為1
?? ?repeat?? ??? ?
?? ??? ?while g[dep]<=n do//能進則進
?? ??? ?begin
?? ??? ??? ?b[g[dep]]:=0;//回溯
?? ??? ??? ?repeat
?? ??? ??? ??? ?inc(g[dep]);?? ?
?? ??? ??? ?until b[g[dep]]=0;//取前進方案
?? ??? ??? ?if (g[dep]>n)? then break;//不符條件
?? ??? ??? ?b[g[dep]]:=1;//記錄之間結果
?? ??? ??? ?if dep=r then print //終點
?? ??? ??? ?else inc(dep);?? ??? ?//進
?? ??? ?end;?? ??? ??? ?
?? ??? ?b[g[dep]]:=0;//回溯
?? ??? ?g[dep]:=0;
?? ??? ?dec(dep);?? ?
?? ?until dep=0;//回溯到起點之前時結束搜索
?? ?writeln(s);
end.
?
var n,i,t,m:integer;
??? g:array[0..100]of integer;
??? b:set of 0..100;
begin
?readln(n,m);
?t:=1;
?b:=[];
?fillchar(g,sizeof(g),0);
?repeat
? while t<=n do
? begin
?? b:=b-[g[t]];
?? repeat
??? inc(g[t]);
?? until (not(g[t] in b)) and ((g[t]>g[t-1]));//過濾條件
?? if (g[t]>n) then break;
?? b:=b+[g[t]];
?? if t=m then
?? begin
??? for i:=1 to m do write(g[i],' ');
??? writeln;
?? end
?? else inc(t);
?? end;
?? b:=b-[g[t]];
?? g[t]:=0;
?? dec(t);
? until t=0;
end.
轉載于:https://www.cnblogs.com/nbalive2001/p/3333191.html
總結
- 上一篇: 高频面试题1:自增边量
- 下一篇: 主存地址的形成