全国青少年信息学奥林匹克联赛搜索基础算法一、深度搜索(DFS)从一个简单题目开始
例1.输出n个元素的无重复的全排列
(1nthen{判断当前第k个位置中是否超界,超界指针后移一位}dec(k)elseiftrythen{判重}begininc(k);x[k]:=0;{前进1位}ifk>nthen{判断指针是否超界,决定一个排列是否完成,完成指针后移一位}beginout;dec(k);end;end;end;end
下面是递归例程:constn=5;varx:array[1
10]ofinteger;functiontry(v1,k:integer):boolean;{判重函数,v1表示位置,k表示所放的值}vari:integer;beginfori:=1tov1-1doifx[i]=kthenbegintry:=false;exit;end;try:=true;end;procedureout;{输出过程}vari:integer;beginfori:=1tondowrite(x[i]);writeln;end;proceduresearch(v:integer);{v表示第v个位置}vari:integer;beginifv>nthenbeginout;exit;end;{若v超界,一个排列完成}fori:=1tondo{在第v个位置上分别放1到n}iftry(v,i)then{如果不重复,处理第v+1个位置}beginx[v]:=i;search(v+1);end;end;beginsearch(1);end
说明:使用非递归的好处是节约内存,当一些题目对内存消耗较大时,建议使用非递归方式;但使用递归方式在程序运行时间上要好一些,因为在每个节点扩展时,递归方式少一个范围超界判断
例题一简单的背包问题
设有一个背包,可以放入的重量为s
现有n件物品,重量分别为均为