题解 P1019 【单词接龙】
一道深搜很好的入门题,可以理解深搜回溯的思想,加一点字符串的技巧。
思路
s[i]是被接的字符串,s[j]是要连接的字串,k是枚举重合的位数。
用的pas函数copy(子串,起始位置,长度)
delete(子串,起始位置,长度)
恕我直言字符串的题pas比c好用
具体看代码
program dasdsf;
uses math;
var s:array[1..22]of string;
b:array[1..22]of integer;
//b数组记录次数
s1,ma:string;//s1是整个操作的字符串
c:char;
i,n:longint;
procedure dfs(i:integer);
var j,k:integer;
begin
if length(s1)>length(ma) then ma:=S1;
//ma用字符串方便调试,也可以用int
for j:=1 to n do
if b[j]<2 then
for k:=1 to min(length(S[i]),length(s[j]))-1 do//两字串不能重复 故min(s[i],s[j])-1
if copy(s[i],length(s[i])-k+1,k)=copy(s[j],1,k) then
begin//标准的回溯
s1:=s1+copy(s[j],k+1,length(s[j])-k);//连接
inc(b[j]);//标记
dfs(j);
DELETE(s1,length(s1)-(length(s[j])-k)+1,length(s[j])-k);//删除已连接
dec(b[j]);//释放标记
end;
end;
begin
read(n);
readln;
for i:=1 to n do
begin
read(s[i]);
readln;
end;
read(c);
for i:=1 to n do
if s[i,1]=c then
begin//标准的深搜
s1:=s[i];
inc(b[i]);
dfs(i);
s1:='';
dec(b[i]);
end;
write(length(ma));
end.