洛谷 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.
时间: 2024-10-15 04:11:42

洛谷 P1032 字串变换 广搜的相关文章

洛谷 P1032 字串变换 (BFS)

题目传送门 我即使是死了,钉在棺材里了,也要在墓里,用这腐朽的声带喊出 STL大法好 这题最麻烦的其实是处理字符串,真正的搜索部分我个人认为也就只有橙题或黄题的难度.而处理字符串,正如前面所说,STL大法好!虽然也有好多人用了STL,但我个人认为我的更精巧一些(各位dalao不要打我 ~(>_<.)\ ) 用STL实现替换是这样的: string repl(int be,string x,string y,string z) //将字符串x从be位置开始的第一个子串y替换成z,如果子串y不被x

洛谷OJ P1032 字串变换 解题报告

洛谷OJ P1032 字串变换 解题报告 by MedalPluS   [题目描述] 已知有两个字串 A$, B$ 及一组字串变换的规则(至多6个规则): A1$ -> B1$ A2$ -> B2$ 规则的含义为:在 A$中的子串 A1$ 可以变换为 B1$.A2$ 可以变换为 B2$ …. 例如:A$='abcd' B$='xyz' 变换规则为: ‘abc’->‘xu’ ‘ud’->‘y’ ‘y’->‘yz’ 则此时,A$ 可以经过一系列的变换变为 B$,其变换的过程为:

洛谷P1126 机器人搬重物 广搜

洛谷P1126 机器人搬重物广搜 这道题其实题目不大清楚 最好配合图片 和 样例一起看 每个点如果是 1 其实管辖的是 上方的点 左边的点 以及 左上方的点 1 #include <bits/stdc++.h> 2 #define For(i,j,k) for(int i=j;i<=k;i++) 3 using namespace std ; 4 5 const int dx[4] = { 0,1,0,-1 } ; 6 const int dy[4] = { 1,0,-1,0 } ; 7

洛谷P1132 数字生成计划 广搜

洛谷P1132 数字生成计划 广搜 三种操作 因为要步数最少,所以广搜 1 #include <bits/stdc++.h> 2 #define For(i,j,k) for(int i=j;i<=k;i++) 3 using namespace std ; 4 5 const int N = 1000011 ; 6 struct node{ 7 int a,ans ; 8 }; 9 bool flag[N] ; 10 int f[N] ; 11 queue<node> q;

P1032 字串变换

蒟蒻的解题报告 P1032 字串变换 题目描述 已知有两个字串 A, B 及一组字串变换的规则(至多6个规则): A1 -> B1 A2 -> B2 规则的含义为:在 A$中的子串 A1 可以变换为 B1.A2 可以变换为 B2 -. 例如:A='abcd'B='xyz' 变换规则为: 'abc'->'xu''ud'->'y''y'->'yz' 则此时,A 可以经过一系列的变换变为 B,其变换的过程为: 'abcd'->'xud'->'xy'->'xyz'

[NOIP2002] 提高组P1032 字串变换

题目描述 已知有两个字串 A, B 及一组字串变换的规则(至多6个规则): A1 -> B1 A2 -> B2 规则的含义为:在 A$中的子串 A1 可以变换为 B1.A2 可以变换为 B2 …. 例如:A='abcd'B='xyz' 变换规则为: ‘abc’->‘xu’‘ud’->‘y’‘y’->‘yz’ 则此时,A 可以经过一系列的变换变为 B,其变换的过程为: ‘abcd’->‘xud’->‘xy’->‘xyz’ 共进行了三次变换,使得 A 变换为B.

洛谷P1279 字串距离

P1279 字串距离 题目描述 设有字符串X,我们称在X的头尾及中间插入任意多个空格后构成的新字符串为X的扩展串,如字符串X为”abcbcd”,则字符串“abcb□cd”,“□a□bcbcd□”和“abcb□cd□”都是X的扩展串,这里“□”代表空格字符. 如果A1是字符串A的扩展串,B1是字符串B的扩展串,A1与B1具有相同的长度,那么我扪定义字符串A1与B1的距离为相应位置上的字符的距离总和,而两个非空格字符的距离定义为它们的ASCII码的差的绝对值,而空格字符与其他任意字符之间的距离为已知

luogu题解P1032字串变换--BFS+STL:string骚操作

题目链接 https://www.luogu.org/problemnew/show/P1032 分析 这题本来很裸的一个BFS,发现其中的字符串操作好烦啊.然后就翻大佬题解发现用STL中的string居然变得这么简洁!!! 各种string操作请看另一位大佬博客,写得很全啊: https://www.cnblogs.com/rvalue/p/7327293.html#commentform 其实我们这题只用到两个相关函数:\(S.find(string,pos)\)和\(S.substr()\

洛谷 P1279 字串距离

题目描述 设有字符串X,我们称在X的头尾及中间插入任意多个空格后构成的新字符串为X的扩展串,如字符串X为”abcbcd”,则字符串“abcb□cd”,“□a□bcbcd□”和“abcb□cd□”都是X的扩展串,这里“□”代表空格字符. 如果A1是字符串A的扩展串,B1是字符串B的扩展串,A1与B1具有相同的长度,那么我扪定义字符串A1与B1的距离为相应位置上的字符的距离总和,而两个非空格字符的距离定义为它们的ASCII码的差的绝对值,而空格字符与其他任意字符之间的距离为已知的定值K,空格字符与空