- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基本搜索算法之广度搜索
基本搜索算法之广度搜索
例题:
给出一个由1,2,3,4,5,6组成的6位数,相邻的两个数字可以交换位置,问最少经过多少次交换,可以到达另一个目标6位数。例如:
对于123456,最少经过两次交换,可以变成231456。
分析:这个题目与前面讲过的深度搜索相比有一个明显不同,会出现“又回去了”的情况(产生树的分支有连通的情况),例如:由123456可以变成213456,而213456又可以变成123456,这样形成了循环。所以需要我们用广度搜索来完成,需要的预备知识是《数据结构》中的队列。关键点在“最少次数及解决树的分支连通问题”。
例程:
const n=6;
var
p1:integer; {队列出列指针,指向openx表}
p2:integer; {队列入列指针, 指向openx表}
openx:array[1..1000] of string[n]; {存放已经出现过的6位数}
openy:array[1..1000] of integer; {存放树(tree)的前缀层数,即当前移动次数}
st1:string; {初始状态,一个6位数}
st2:string; {目标状态,一个6位数}
st:string;
i:integer;
tc:char;
function find(stx:string):boolean; {对生成新的状态进行判重}
var i:integer;
begin
for i:=1 to p2 do
if stx=openx[i] then
begin find:=false;exit;end;
find:=true;
end;
procedure out; {结果输出}
begin
writeln(openy[p1+1]);
halt;
end;
begin
readln(st1);
readln(st2);
p1:=1;p2:=1;openx[1]:=st1; {初始设置}
fillchar(openy,sizeof(openy),0);
while p1=p2 do
begin
for i:=1 to n-1 do {对当前x[p1]状态,生成所有有效分支}
begin
st:=openx[p1];
tc:=st[i];st[i]:=st[i+1];st[i+1]:=tc; {交换位置I和i+1中的数字}
if st=st2 then {达到目标状态,转向结果输出}
out;
if find(st) then {判重}
begin
inc(p2);openx[p2]:=st; {队列入列操作}
openy[p2]:=openy[p1]+1; {取得当前树的扩展层数,即:移动次数}
end;
end;
inc(p1); {队列出列操作}
end;
end.
有一些资料的描述是,把队列放在一个独立的线性表中,上面的程序是直接把队列放在数组openx中,这样节约一些空间。显然DFS的时间效率体现在“判重”的算法上,提高时间效率方法很多,其中hash表是重要的一种算法,请参看相关资料。
例题二
有10升油在10升的容器中,另有两个7升和3升的空容器,要求用这三个容器倒油,使得最后在10升和7升的容器中各有5升油,问最少的倒油次数是多少?
var
a:array[1..3] of integer; {每个容器的容量}
x:array[1..1000,1..3] of shortint; {存放已经出现过的状态}
y:array[1..1000] of integer; {存放树(tree)的前缀层数,即当前倒油次数}
b:array[1..3] of integer; {目标状态}
c:array[1..3] of integer;
p1:integer;
p2:integer;
i,j,t:integer;
pt:boolean;
procedure init;
begin
assign(input,xx1.txt);
reset(input);
readln(a[1],a[2],a[3]);
readln(x[1,1],x[1,2],x[1,3]); {读取初始状态}
readln(b[1],b[2],b[3]); {读取目标状态}
close(input);
end;
procedure out;
begin
writeln(y[p1]+1);
halt;
end;
function find:boolean;
var i:integer;
begin
for i:=1 to p2 do
if (c[1]=x[i,1]) and (c[2]=x[i,2]) and (c[3]=x[i,3]) then
begin find:=false;exit;end;
find:=true;
end
您可能关注的文档
最近下载
- 水果知识培训榴莲.pptx VIP
- 《无人机概论》高职无人机应用技术专业全套教学课件.pptx
- 公安局辅警招聘考试试题库《综合理论知识》(含政治理论、法律法规、公安工作基本知识).pdf VIP
- EN10346:2015_连续热浸镀钢带产品交货技术条件中文版.pdf VIP
- 山东初级注册安全工程师考试题库.pdf VIP
- 卫星遥测数据处理方法、系统及星座状态监控平台.pdf VIP
- 东风螺粉状配合饲料 .pdf VIP
- 高一下学期化学人教版必修第二册用化学沉淀法去除粗盐中的杂质离子课件.pptx VIP
- 2022版三甲评审资料 医院安全保卫管理制度.pdf VIP
- 全过程工程咨询服务 方案(技术方案).doc
文档评论(0)