6. 设 ai1—状态元素ai的最小值;aik—状态元素ai的最大值(1≤i≤n),即a11≤a1≤a1k,a21≤a2≤a2k, ai1≤ai≤aik,……,an1≤an≤ank
for a1←a11 to a1k do
fo a2←a21 to a2k do ……………………
for ai←ai1 to aik do ……………………
for an←an1 to ank do
if 状态(a1,…,ai,…,an)满足检验条件
then 输出问题的解;
12. 枚举过程可以描述为:
min:=+∞;
for line:=1 to m do
begin
求出line行上、下元素绝对值之差difference;
if min>difference then
begin
min:=difference;
保存line作为矩阵中心所在行;
end;
end;枚举算法的应用
22. 算法流程:
dis[x1,y1,x2,y2]--(x1,y1)(x2,y2)之间的距离。
For I:=1 to 8 do{枚举汇合点}
For j:=1 to 8 do begin
All :=所有骑士到这一点的和;
Best:=min(best,all+国王到汇聚点的步数)
For x:=1 to 8 do {枚举武士国王的相会点}
For y:=1 to 8 do begin
For kk:=1 to k do {枚举与国王结合的武士}
If dis[knight[kk].x,knight[kk].y,x,y]
40. 基本搜索算法一【回溯算法】
Node(节点类型)=Record
Situtation:TSituation(当前节点状态);
Way-NO:Integer(已使用过的扩展规则的数目);
End
41. 基本搜索算法一【回溯算法】[递归算法]
Procedure BackTrack(Situation:TSituation;deepth:Integer);
Var i:Integer;
Begin
If deepth>Max then (空间达到极限,跳出本过程);
If Situation=Target then (找到目标);
For I:=1 to TotalExpendMethod do Begin
BackTrack(ExpendNode(Situation,I),deepth+1);
End-For;
End;
42. 构造字串
生成长度为n的字串,其字符从26个英文字母的前p(p≤26)个字母中选取,使得没有相邻的子序列相等。例如p=3,n=5时
‘a b c b a’满足条件
‘a b c b c’不满足条件
输入:n,p
输出:所有满足条件的字串
45. procedure solve(at:integer);{递归扩展第at个字母}
var
ch:char; i:integer;
begin
if at=n+1 {若产生了一个满足条件的字串,则输出,满足条件的字串数+1}
then begin
writeln(f,s); inc(tl);exit{回溯}
end;{then}
for ch←'a' to ed do {搜索每一个可填字母}
begin
s←s+ch;i←1;{检查当前字串是否符合条件}
while(i<=at div 2)and(copy(s,length(s)-i+1,i)<>copy(s,length(s)-2*i+1,i)) do inc(i);
if i>at div 2 then solve(at+1);{若当前字串符合条件,则递归扩展下一个字母}
delete(s,length(s),1){恢复填前的字串}
end{for}
end;{solve}
begin
readln(n,p);{输入字串长度和前缀长短}
ed←chr(ord('a')+p-1);{计算可选字母集中的最大字母}
s←''; tl←0;{满足条件的字串初始化为空,字串数为0}
solve(1);{从第1个字母开始递归计算所有满足条件的字串}
writeln('Total:',tl);{输出满足条件的字串数}
end.{main}
73. 思路二:对于一个n,先构造一个最接近的2^k,然后利用在构造过程中产生的2^I,对n-2^k进行二进制分解,可以得出解。对次数的计算的描述如下:
count:=0;
Repeat
If n mod 2 = 0 then count:=count+1
Else count:=count+2;
n:=n div 2;
Until n=1;
Result:=count; 分析