深优先搜索算法
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第11页/共32页
Input.txt
B[I] n个数据 K值
have
true
Made(1)
have
Y
N
输出无解信息
第12页/共32页
Made(s)
取第1组的第S个数
前提: 前S-1个数是合法的 S<M
i
0 to 9
B[i]>0
Y
N
Z[s]
i
B[I]:=B[I]-1
S<M
Y
N
Made(s+1)
pass
第9页/共32页
ቤተ መጻሕፍቲ ባይዱ
• INPUT.TX T • 123456789 •3
• OUTPUT.TX T • 192 384 576 • 219 438 657 • 273 546 819 • 327 654 981
第10页/共32页
用数组B[0..9]来存储N个数字 存储规则: B[0]存储N个数字中0的个数 B[1]存储N个数字中1的个数 B[2]存储N个数字中2的个数 ………… ………… B[8]存储N个数字中8的个数 B[9]存储N个数字中9的个数
第3页/共32页
二. 非递归算法 program DFS(dep); dep:=0; repeat
dep:=dep+1;j:=0;p:=false; repeat
j:=j+1; if 子结点mr符合条件 then
产生子结点mr并将其记录 if 子结点是目标 then 输出并出栈(更新j) else p:=true; else if j>maxj then 回溯 else p:=false; until p=true; until dep=0;
第23页/共32页
键盘输入一个仅由小写字母组成的字符 串,输出以该串中任取M个字母的所有 排列及排列总数。
第24页/共32页
初始化Init 搜索Search 输出总数tot
第25页/共32页
输入STR,M NUM:=频率 总数TOT:=0
搜索指针LEV:=0
ANS:=首数列
第26页/共32页
search
5
8
6
7
数组A
-1 -2 -2 -1 1 2 2 1
2 1 -1 -2 -2 -1 1 2
第16页/共32页
设置8个方向变化 初始化board
Board[1,1]
1
try(1,1,2,q)
q
Y
N
输出结果
输出无解信息
第17页/共32页
Try(x,y,i,q)
表示对(x,y)位置 作为第i步向前试探 的过程。若试探成 功,逻辑变量q的值 为true,否则为false
LEV=M Y
N
INC(TOT) 输出ANS
INC(LEV)
C
‘a’ to ‘z’
Num[c]>0
Y
N
dec(num[c])
ans(lev):=c search
dec(lev)
inc(num[c])
第27页/共32页
-----回溯法
迷宫问题
第28页/共32页
入口
第29页/共32页
出口
输入: 1.迷宫; 2.入口; 3.出口。
If g>0 then exit
输出结果到OUTPUT Have:=false
第14页/共32页
• 骑士游历问题:在6*6的国际象棋上的某一位置上放置一“马”,然后采用 象棋中“马走日字”的规则,要求该“马”能不重复地走完36个格子,试 编写程序解决这个问题。
第15页/共32页
3 4
2 1
X,Y
一. 递归算法: 递归过程为: procedure TRY(i); For r:=1 to maxr do (maxr是产生式规则数) begin If 子结点MR 符合条件 THEN
begin 产生的子结点MR压入栈; IF 子结点 MR是目标结点 THEN 输出 ELSE TRY(I+1); 栈顶元素出栈(删去MR);
321 2
第19页/共32页
数据初始化
have
true
Made(1)
have
Y
N
输出无解信息
第20页/共32页
Made(t)
填写第t个数
前提: 前t-1个数是合法的 t<n
i
1 to n
b[t]:=i
Pass1(I,t) and YN(a[t-1]+b[t])
Y
N
a[t]:=i
t<n
Y
N
Made(t+1)
B[I]:=B[I]+1
第13页/共32页
Pass 检验第2组- - 第K组数是否合 格,如合格则输出
其中bb是b的拷贝
将Z[1]—Z[m]中数字计算出值赋给E
i
2 to k
g
E*i
j
M downto 1
h
g mod 10
g
g div 10
bb[h]>0 Y
bb[h]:=bb[h]-1
N exit
************
*
*
*** **** * *
* * **** * *
**
**
* * ********
*** ****** *
*
*
***** ** ***
*
* ** ***
*
*
*
************
第30页/共32页
输出: 1.搜索完的迷宫; 2.行走路线; 3.如没有可行路线, 需给出提示。
end; end; {**********main**********} program DFS; 初始栈; TRY(1);
第2页/共32页
Try(I)
For r:=1 to maxr do
子结点mr符合条件
Y
N
产生的子结点mr入栈
子结点mr是目标结点
Y
N
输出
Try(I+1)
栈顶元素出栈(删去mr)
Pass2(t)
第21页/共32页
填数字
有如图所示的九个小方
格,在每个方格中填入0-9 中的一个数字,每个数字只
1
能用一次,并使每行的数字
组成的自然数都是完全平方 数,如图的填法就是一种合
36
法的情况。试编程找出所有
正确的填法。 输出要求:每行输出四
784
个自然数(分别为一位数,
二位数,三位数,四位数),
第32页/共32页
9 表示一种填法,两数之间用 0 2 5
空格分隔。例如上图情况输
出:1 36 784 9025。
第22页/共32页
For I:=1 to 3 求I*i ,分离各位数字 For j:=4 to 9 求j*j ,分离各位数字 For k:=11 to 31 求k*k, 分离各位数 字 For p:=32 to 99 求p*p , 分离各位数 字
第4页/共32页
其中回溯过程如下: procedure backtracking; dep:=dep-1; if dep>0 then 取回栈顶元素 else p:=true;
第5页/共32页
Dep:=0
Dep:=dep+1
j:=0;p:=false;
j:=j+1;
Y
Mr符合条件
N
产生子节点MR并记录 Y J>=maxj N
第7页/共32页
A12345678 Y
1
P5 P4
2 P6
3
P3 马
4 P7
P2
X
P8
P1
B(4,8)
第8页/共32页
现有n个数字(n<=200),要求把这n个数 字划分成K(K能整除N,设M=N/K)个 集合S1, S2, S3 … Sk,,每个集合均有M 个数字,集合Si中的数字按某种次序串接, 构成一个正整数Li(i=1,2,3, … ,k),问怎 样划分和排列集合S1, S2, S3 … Sk,,使 得L1:L2 :L3 : … :Lk=,1:2: 3: …:k.
************
. . ..
*
*
*** .**** * *
* * .**** * *
* *.
**
* * .********
*** .****** *
*
... ...
*
* * * * * * * .* * *
*
* * * .* * *
*
*
* ....
************
第31页/共32页
感谢您的观看!
K
0
k←k+1 q1←false
u←x+a[1,k] v←y+a[2,k]
Y Y
合格
N
Board=0 N
Board[u,v] ←i
Y
i<n*n
N
Try(u,v,i+1,q1)
Y
Not (q1)
Q1:=true
N
Board[u,v]:=0
Q1 OR (K=8)
第18页/共32页
Q:=Q1
试编程将1至N(N≤10)的自然数序列1,2,…, N重新排列,使任意相邻两数之和为素数。例如N =3时有两种排列方案123、321满足要求。 输入要求:N从键盘输入。 输出要求:每行输出一种排列方案(相邻数字之间 用空格分隔)。 最后一行输出排列方案总数。 例如输入 3 输出 1 2 3
Y
子节点是目标 N
回溯
P:=false
输出并出栈 P:=true
Until p=false
Until dep=0
第6页/共32页
如图:A点有一个过河卒,需要走到目标B点。卒行走的规则:可以向 下、或者向右。同时在棋盘上的任一点有一个对方的马(如图的C点), 该马所在的点和所有串跳跃一步可达的点称为对方马的控制点。例如图 中C点上的马可以控制9个点(图中的P1,P2,…,P8和C)。卒不能 通过对方马的控制点。 棋盘用坐标表示,A点(0,0)、B点(n,m)(n,m为不超过20的整数, 并由键盘输入),同样马的位置坐标是需要给出的(约定:C<>A,同时 C<>B)。现在要求你计算出卒从A点能够到达B点的路径的条数。
Input.txt
B[I] n个数据 K值
have
true
Made(1)
have
Y
N
输出无解信息
第12页/共32页
Made(s)
取第1组的第S个数
前提: 前S-1个数是合法的 S<M
i
0 to 9
B[i]>0
Y
N
Z[s]
i
B[I]:=B[I]-1
S<M
Y
N
Made(s+1)
pass
第9页/共32页
ቤተ መጻሕፍቲ ባይዱ
• INPUT.TX T • 123456789 •3
• OUTPUT.TX T • 192 384 576 • 219 438 657 • 273 546 819 • 327 654 981
第10页/共32页
用数组B[0..9]来存储N个数字 存储规则: B[0]存储N个数字中0的个数 B[1]存储N个数字中1的个数 B[2]存储N个数字中2的个数 ………… ………… B[8]存储N个数字中8的个数 B[9]存储N个数字中9的个数
第3页/共32页
二. 非递归算法 program DFS(dep); dep:=0; repeat
dep:=dep+1;j:=0;p:=false; repeat
j:=j+1; if 子结点mr符合条件 then
产生子结点mr并将其记录 if 子结点是目标 then 输出并出栈(更新j) else p:=true; else if j>maxj then 回溯 else p:=false; until p=true; until dep=0;
第23页/共32页
键盘输入一个仅由小写字母组成的字符 串,输出以该串中任取M个字母的所有 排列及排列总数。
第24页/共32页
初始化Init 搜索Search 输出总数tot
第25页/共32页
输入STR,M NUM:=频率 总数TOT:=0
搜索指针LEV:=0
ANS:=首数列
第26页/共32页
search
5
8
6
7
数组A
-1 -2 -2 -1 1 2 2 1
2 1 -1 -2 -2 -1 1 2
第16页/共32页
设置8个方向变化 初始化board
Board[1,1]
1
try(1,1,2,q)
q
Y
N
输出结果
输出无解信息
第17页/共32页
Try(x,y,i,q)
表示对(x,y)位置 作为第i步向前试探 的过程。若试探成 功,逻辑变量q的值 为true,否则为false
LEV=M Y
N
INC(TOT) 输出ANS
INC(LEV)
C
‘a’ to ‘z’
Num[c]>0
Y
N
dec(num[c])
ans(lev):=c search
dec(lev)
inc(num[c])
第27页/共32页
-----回溯法
迷宫问题
第28页/共32页
入口
第29页/共32页
出口
输入: 1.迷宫; 2.入口; 3.出口。
If g>0 then exit
输出结果到OUTPUT Have:=false
第14页/共32页
• 骑士游历问题:在6*6的国际象棋上的某一位置上放置一“马”,然后采用 象棋中“马走日字”的规则,要求该“马”能不重复地走完36个格子,试 编写程序解决这个问题。
第15页/共32页
3 4
2 1
X,Y
一. 递归算法: 递归过程为: procedure TRY(i); For r:=1 to maxr do (maxr是产生式规则数) begin If 子结点MR 符合条件 THEN
begin 产生的子结点MR压入栈; IF 子结点 MR是目标结点 THEN 输出 ELSE TRY(I+1); 栈顶元素出栈(删去MR);
321 2
第19页/共32页
数据初始化
have
true
Made(1)
have
Y
N
输出无解信息
第20页/共32页
Made(t)
填写第t个数
前提: 前t-1个数是合法的 t<n
i
1 to n
b[t]:=i
Pass1(I,t) and YN(a[t-1]+b[t])
Y
N
a[t]:=i
t<n
Y
N
Made(t+1)
B[I]:=B[I]+1
第13页/共32页
Pass 检验第2组- - 第K组数是否合 格,如合格则输出
其中bb是b的拷贝
将Z[1]—Z[m]中数字计算出值赋给E
i
2 to k
g
E*i
j
M downto 1
h
g mod 10
g
g div 10
bb[h]>0 Y
bb[h]:=bb[h]-1
N exit
************
*
*
*** **** * *
* * **** * *
**
**
* * ********
*** ****** *
*
*
***** ** ***
*
* ** ***
*
*
*
************
第30页/共32页
输出: 1.搜索完的迷宫; 2.行走路线; 3.如没有可行路线, 需给出提示。
end; end; {**********main**********} program DFS; 初始栈; TRY(1);
第2页/共32页
Try(I)
For r:=1 to maxr do
子结点mr符合条件
Y
N
产生的子结点mr入栈
子结点mr是目标结点
Y
N
输出
Try(I+1)
栈顶元素出栈(删去mr)
Pass2(t)
第21页/共32页
填数字
有如图所示的九个小方
格,在每个方格中填入0-9 中的一个数字,每个数字只
1
能用一次,并使每行的数字
组成的自然数都是完全平方 数,如图的填法就是一种合
36
法的情况。试编程找出所有
正确的填法。 输出要求:每行输出四
784
个自然数(分别为一位数,
二位数,三位数,四位数),
第32页/共32页
9 表示一种填法,两数之间用 0 2 5
空格分隔。例如上图情况输
出:1 36 784 9025。
第22页/共32页
For I:=1 to 3 求I*i ,分离各位数字 For j:=4 to 9 求j*j ,分离各位数字 For k:=11 to 31 求k*k, 分离各位数 字 For p:=32 to 99 求p*p , 分离各位数 字
第4页/共32页
其中回溯过程如下: procedure backtracking; dep:=dep-1; if dep>0 then 取回栈顶元素 else p:=true;
第5页/共32页
Dep:=0
Dep:=dep+1
j:=0;p:=false;
j:=j+1;
Y
Mr符合条件
N
产生子节点MR并记录 Y J>=maxj N
第7页/共32页
A12345678 Y
1
P5 P4
2 P6
3
P3 马
4 P7
P2
X
P8
P1
B(4,8)
第8页/共32页
现有n个数字(n<=200),要求把这n个数 字划分成K(K能整除N,设M=N/K)个 集合S1, S2, S3 … Sk,,每个集合均有M 个数字,集合Si中的数字按某种次序串接, 构成一个正整数Li(i=1,2,3, … ,k),问怎 样划分和排列集合S1, S2, S3 … Sk,,使 得L1:L2 :L3 : … :Lk=,1:2: 3: …:k.
************
. . ..
*
*
*** .**** * *
* * .**** * *
* *.
**
* * .********
*** .****** *
*
... ...
*
* * * * * * * .* * *
*
* * * .* * *
*
*
* ....
************
第31页/共32页
感谢您的观看!
K
0
k←k+1 q1←false
u←x+a[1,k] v←y+a[2,k]
Y Y
合格
N
Board=0 N
Board[u,v] ←i
Y
i<n*n
N
Try(u,v,i+1,q1)
Y
Not (q1)
Q1:=true
N
Board[u,v]:=0
Q1 OR (K=8)
第18页/共32页
Q:=Q1
试编程将1至N(N≤10)的自然数序列1,2,…, N重新排列,使任意相邻两数之和为素数。例如N =3时有两种排列方案123、321满足要求。 输入要求:N从键盘输入。 输出要求:每行输出一种排列方案(相邻数字之间 用空格分隔)。 最后一行输出排列方案总数。 例如输入 3 输出 1 2 3
Y
子节点是目标 N
回溯
P:=false
输出并出栈 P:=true
Until p=false
Until dep=0
第6页/共32页
如图:A点有一个过河卒,需要走到目标B点。卒行走的规则:可以向 下、或者向右。同时在棋盘上的任一点有一个对方的马(如图的C点), 该马所在的点和所有串跳跃一步可达的点称为对方马的控制点。例如图 中C点上的马可以控制9个点(图中的P1,P2,…,P8和C)。卒不能 通过对方马的控制点。 棋盘用坐标表示,A点(0,0)、B点(n,m)(n,m为不超过20的整数, 并由键盘输入),同样马的位置坐标是需要给出的(约定:C<>A,同时 C<>B)。现在要求你计算出卒从A点能够到达B点的路径的条数。