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.

 

 

posted @ 2013-10-29 20:54  qilinart  阅读(168)  评论(0编辑  收藏  举报