洛谷 P1032 字串变换 广搜[通俗易懂]

洛谷 P1032 字串变换 广搜

大家好,又见面了,我是全栈君。

这道题原本我用深搜,结果会T,wcnm,然后就直接参考题解了

 

 1 Const maxn=10000;                                     
 2       maxq=100000; 
 3 Var a:array[0..1,0..maxn]of string;//变换规则 
 4     q:array[0..1,0..maxq]of string;//两个队列 
 5     step:array[0..1,0..maxn]of longint;//步数
 6     head,tail:array[0..1]of longint;//两个队列的头指针和尾指针 
 7     int,aim,s1,s2,s:string; 
 8     n:longint; 
 9 Procedure split(s:string);//将目标状态和初始状态记录下来 
10 var k:longint; 
11 begin 
12   k:=pos(' ',s); 
13   s1:=copy(s,1,k-1); 
14   s2:=copy(s,k+1,length(s)-k); 
15 end; 
16 Procedure init; //读入
17 begin 
18   readln(s); 
19   split(s); 
20   int:=s1;//初始状态
21   aim:=s2;//目标状态 
22   n:=0; 
23   while not eof do 
24   begin 
25     readln(s); 
26     if s='' then exit; 
27     inc(n); 
28     split(s); 
29     a[0,n]:=s1;//初始的可以转换的状态
30     a[1,n]:=s2;//由初始状态转换一步得到的目标状态
31   end; 
32 end; 
33 Function vis(s:string;t:byte):boolean; 
34 var i:longint; 
35 begin 
36   vis:=false; 
37   for i:=1 to tail[t] do//遍历队列
38   if q[t,i]=s then exit(true);//如果找到目标状态就返回值true 
39 end; 
40 Procedure print(k:longint); 
41 begin 
42   writeln(k);//(如果合法)输出最少变换步数 
43   halt; 
44 end; 
45 Procedure check(t:byte); 
46 var i:longint; 
47 begin 
48   for i:=1 to tail[1-t] do //遍历队列(当前的状态保存在队列里)
49   if q[1-t,i]=q[t,tail[t]] then //如果两个广搜碰头了
50   print(step[1-t,i]+step[t,tail[t]]);//总的步数就是两个广搜步数之和 
51 end; 
52 Procedure bfs(t:byte); //广搜(t=0是正着搜,t=1是反着搜)
53 var i,j,k:longint; 
54     pre,tmp:string; 
55 begin 
56   inc(head[t]);//头指针加一
57   pre:=q[t,head[t]];//入队 
58   for i:=1 to n do//遍历变换规则 
59   begin 
60     k:=length(a[t,i]); 
61     for j:=1 to length(pre)-k+1 do//按照变换规则扩展状态 
62     begin 
63       if copy(pre,j,k)=a[t,i] then//如果规则符合 
64       begin 
65         tmp:=copy(pre,1,j-1)+a[1-t,i]+copy(pre,j+k,length(pre)-j-k+1);//扩展下一个状态 
66         if not vis(tmp,t) then//如果没有找到目标状态 
67         begin 
68           inc(tail[t]); 
69           q[t,tail[t]]:=tmp; 
70           step[t,tail[t]]:=step[t,head[t]]+1;//步数++ 
71         end; 
72         check(t);//检查是否终止搜索(注意位置,不然就T了)
73       end; 
74     end; 
75   end; 
76 end; 
77 Procedure doublebfs;//用数组下标来区分两个队列和两个广搜 
78 begin 
79   head[0]:=0;//第一个队列的头指针
80   head[1]:=0;//第二个队列的头指针
81   tail[0]:=1;//第一个队列的尾指针
82   tail[1]:=1;//第二个队列的尾指针 
83   q[0,1]:=int;//初始状态
84   q[1,1]:=aim;//目标状态
85   step[0,1]:=0;//步数
86   step[1,1]:=0;//步数 
87   while (head[0]<tail[0])and(head[1]<tail[1])do 
88   if tail[1]<tail[0] then 
89   bfs(1) else bfs(0);//保持两个广搜的同步 
90 end; 
91 Begin 
92   init; 
93   doublebfs; 
94   writeln('NO ANSWER!'); 
95 End.

 

转载于:https://www.cnblogs.com/third2333/p/6829212.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/108511.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • linux 下查看有当前文件夹有多少个文件

    linux 下查看有当前文件夹有多少个文件

    2021年10月15日
    54
  • DLL注入explorer.exe进程[通俗易懂]

    DLL注入explorer.exe进程[通俗易懂]**DLL注入explorer.exe进程**  最近一直在学习dll注入远程进程的相关知识,于是有了这篇文章。通过注入的方式会运行程序,在资源管理器中是看不到,相关的进程的,这为程序的隐藏提供了极大的便利。一、新建dll动态链接库,然后在dllmain.cpp文件中的“caseDLL_PROCESS_ATTACH:”下输入当你dll被进程加载时要执行的代码。这里我们用“Messag…

    2022年5月17日
    49
  • 规范约束条件

    规范约束条件我们在开发时往往会对泛型指定约束条件,只有类型参数符合条件的才允许用在这个泛型上面。但是有时我们会定义过多或过少的约束条件,过多的约束条件会导致其他开发人员在使用你所编写的方法或类时做很多的工作以满足这些约束,过少的约束又会导致程序在运行的时候必须做很多的检查,并执行更多的强制类型转化操作,有时我们还需要使用反射生成运行期错误,来防止用户误用这个类。要解决这些问题,我们就必须把确实需要的约束写出来…

    2022年10月13日
    1
  • Android Studio的安装,史上最详细(超多图)!!

    Android Studio的安装,史上最详细(超多图)!!androidstudio的安装,史上最详细!!欢迎前来观看,感觉有用就点波关注吧!custom欢迎前来观看,感觉有用就点波关注吧!1、首先下载Androidstudio安装包,可以从http://www.android-studio.org/下载最新版本,这里采用3.0版本进行演示,对应安装包为android-studio-ide-183.5522156-windows,…

    2022年6月14日
    41
  • java输入语句_java输入语句是什么

    java输入语句_java输入语句是什么Java的语句有很多,其中输入语句是最基本的操作之一。下面我将带大家一起了解一下要如何进行输入代码的编写。首先当你进行输入操作前要将下面两个包给加入Java程序的包行列中。先将java.io.*;以及java.util.*;导入Java代码中。importjava.util.*;importjava.io.*;charc=(char)System.in.read();是输入单个字符;int…

    2022年7月7日
    20
  • Spring学习—生成图片验证码

    今天想学下一下验证码的生成,就之前搭建好的一个spring框架上写了一个demo,我会贴出细节代码,但是spring的配置就不在介绍了。需要完整代码可以联系我! 会从前台页面到后台实现完整的讲解: 1:前台的代码,image.jsp<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="U

    2022年2月25日
    45

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号