单词接龙是一个与我们经常玩的成语接龙相类似的游戏。现在我们已知一组单词,且给定一个开头的字母,要求输出以这个字母开头的最长的“龙”(每个单词在“龙”中只能出现一次),在两个单词相连时,其重合部分合为一部分,例如begin和integer,如过连接成一条龙则变为beginteger,另外相邻的两部分不能存在包含关系,例如in和integer间不能相连。
输入格式(long.in):输入的第一行为一个单独的整数n,(n<=20)表示单词数,以下每行有一个单词。输入的最后一行为一个单个字符,表示“龙”开头的字母。保证以此开头的“龙”一定存在。
输出格式(long.out);只需输出以此字母开头的最长的“龙”的长度。
输入输出样例:
输入:
5
at
touch
cheat
choose
tact
a
输出:13(连成的“龙”为“atactouchoose”)
希望大家能帮帮忙。
网上搜的也没问题,只要在回答之前试一下,是对的再付过来吧.
谢谢你的程序,但是,我在电脑上运行的结果是不对的,只输了一个
5
at 就出现了错误代码106,请您再帮忙看一下.
呃..106是缺字符表达式..
其实呢.这条程序不是我写的,我找的时候就直接 c&p了. 刚才看了下,发现这个程序貌似牛头不对马嘴..
好了,很无耻得再 c&p一条.
var
add:array[1..20,1..20] of integer;
y:array[1..20] of integer;
a:array[1..20] of string;
n,i,h,j:integer;
head:char;
function min(x,y:integer):integer;
begin
if x>y then min:=y else min:=x;
end;
procedure calcadd;
var i,j,k,t:integer;
ifx:boolean;
begin
for i:=1 to n do
for j:=1 to n do begin
for k:=1 to min(length(a[i]),length(a[j]))-1 do begin
ifx:=true;
for t:=1 to k do
if a[j,t]a[i,length(a[i])-k+t] then begin
ifx:=false;
break;
end;
if ifx then break;
end;
if ifx then add[i,j]:=length(a[j])-k else
add[i,j]:=0;
end;
end;
procedure dfs(l,len:integer);
var i:integer;
begin
if len>h then h:=len;
for i:=1 to n do
if (add[l,i]>0)and(y[i]<2) then begin
inc(y[i]);
dfs(i,len+add[l,i]);
dec(y[i]);
end;
end;
begin
readln(n);
for i:=1 to n do readln(a[i]);
calcadd;
h:=0;
readln(head);
for i:=1 to n do begin
if a[i,1]=head then begin
y[i]:=1;
dfs(i,length(a[i]));
y[i]:=0;
end;
end;
writeln(h);
end.
参考资料:http://hi.baidu.com/zhyfzy/blog/item/17cd5a33c69eaaf61b4cfff2.html
追问回答是13,不是23
追答什么意思? 这条程序应该能通过的?. 你说哪个值?
答案13,不是23
PASCAL 题目,不难,希望各位高手能帮帮菜鸟,急急急急急、跪求
题目描述似乎短了点,有些地方没说清楚 1."相邻的两部分不能存在包含关系"这个不管它 2.相邻的单词必须有重叠部分 3.样例中,tact+tact=tactact 4.121212+121212=1212121212而不是12121212 5.n达不到20 注意到这些,只要DFS就可以AC了 丑陋的代码:var a:array[1..20,1..20] of longint;word:a...
关于Free Pascal 编程问题
3)应该是:可见,这次在前面的基础上要加上一个输出空格的语句,不难发现空格数与2)的星星数是相同的,所以直接把上面的程序中write('*')改成write(' ')。然后考虑星星数,因为行数 i 每加一,星星数就加了 2 ,所以 for j:=1 to 2*i-1 {就是第i行画2*i-1个星星} 程序实现:for ...
Pascal语言问题
你程序中 and (ord(b='c')+ord(e='e')+1) 这句能编译通过么。是不是 and (ord(b='c')+ord(e='e')=1)你是不是没有处理同一个项目却有多个人获冠军的情况?可以把循环改成这样——for a:='a' to 'e' do begin for b:='a' to 'e' do if a<>b then begin for c:...
我的孩子今年小学五年级,要参加Turbo Pascal 7.0小学程序设计竞赛_百度...
72. 在下面算式○中填入加号或减号,使算式结果等于键盘输入的S(S<200的自然数,且 S 是 9 的倍数).如果某个○不填符号,则将前后两个数字连成一个数(如:第一个○不填符号,即读成12),不允许相邻的两个○都不填符号.如果对S有多种填法,必须全部填出,如果找不到填法,则打印\\'NO!\\'. 1○2○3○4...
我想学习编程,现在是一窍不通.怎么办?
推荐你看几本书,当然不单单是看,要能领会,看完这几本数,再做一些实际的项目,你会有突飞猛进的感觉。我们国内的大学课程很多还只是局限于理论,平时多看别人写的代码,条件可以的话多看一些国外的开源网站,这是很有益处的。1、《C.Primer第三版中文版》C++ Primer的第三版结合了Stanley Lippman...