NOIP2000T4 单词接龙

 

#include<iostream>
#include<string>
using namespace std;
string words[21];//words[0]存取龙头,剩下的存取单词 
int record[21];//存取每个单词的访问次数(每个单词最多只能用两次~~) 
int n;
int sum=0;//存取最长的龙的长度 
int conn_len(int i,int j){
    int min_len=min(words[i].size(),words[j].size());
    for(int k=1;k<=min_len;k++){
        if(words[i].substr(words[i].size()-k,k)==words[j].substr(0,k))//在这里截取字符串,words[i]从最后一个开始截取,words[j]从第一个截取,每截取一次就判断一下是否相同,相同的话就返回剩下的长度 
        return words[j].size()-k;
    }
    return 0;
}
void dfs(int len,int p){
    sum=max(sum,len);//每加上一个单词就更新一次最大长度 
    for(int i=1;i<=n;i++){
        if(record[i]>1)continue;
        int k=conn_len(p,i);
        if(!k)continue;
        record[i]++;
        dfs(len+k,i);
        record[i]--;
    }
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)cin>>words[i];
    cin>>words[0];
    dfs(1,0);
    cout<<sum<<endl;
    return 0;
}

  

 

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char word[25][100],fir[10];
int ans,n,check[25];
bool str_cmp(char *a,char *b){
    int len=strlen(a);
    for(int i=0;i<len;i++)
        if(a[i]!=b[i]) return false;
    return true;
}
void DFS(char *s,int wei){
    ans=max(ans,wei);
    int len=strlen(s);
    for(int i=1;i<len;i++)
        for(int j=1;j<=n;j++)
            if(str_cmp(s+i,word[j]) && check[j]){
                check[j]--;
                DFS(word[j],wei-len+i+strlen(word[j]));
                check[j]++;
            }
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%s",word[i]);
    scanf("%s",fir+1);    fir[0]=1;
    for(int i=1;i<=n;i++)check[i]=2;
    DFS(fir,1);
    printf("%d\n",ans);
    return 0;
}

  

 

 

 

var
    c:array[0..20,0..20] of longint;
    b,d:array[0..20] of longint;
    s:array[1..20] of string;
    ch:char;
    n,i,j,k,t,max:longint;

function check(i,j:longint):longint;
var k,l1,l2,l:longint;
begin
    if d[i]<d[j] then l:=d[i] else l:=d[j];
    for k:=1 to l-1 do
        if copy(s[i],d[i]-k+1,k)=copy(s[j],1,k) then exit(k);
    exit(0);
end;

procedure work(k,s:longint);
var i,j:longint;
begin
    if s>max then max:=s;
    for i:=1 to n do
        if (b[i]<2) and (c[k,i]>0) then
        begin
            inc(b[i]);
            work(i,s+d[i]-c[k,i]);
            dec(b[i]);
        end;
end;

begin
    assign(input,'dcjl.in'); reset(input);
    assign(output,'dcjl.out'); rewrite(output);
    readln(n);
    for i:=1 to n do
    begin
        readln(s[i]);
        d[i]:=length(s[i]);
    end;
    readln(ch);
    for i:=1 to n do
        for j:=1 to n do
            c[i,j]:=check(i,j);
    for i:=1 to n do
        if s[i][1]=ch then
        begin
            b[i]:=1;
            work(i,d[i]);
            b[i]:=0;
        end;
    writeln(max);
    close(input); close(output);
end.

 

 

转载于:https://www.cnblogs.com/qilinart/articles/3395132.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值