CODEVS 1018单词接龙

新颖方法

#include<string.h>
#include<iostream>
using namespace std;
struct a{
    int chongd,v;
}G[25][25];
int cut[25],vis[25],trytry,n,maxn=-1;
char a[25][20],b;
int catchdragon(char* x,char* y,int m,int n){
    int i=strlen(x),j=strlen(y),ok=0,changshi,chongdie;
    int mininum=(i<j?i:j);
    for(chongdie=1;chongdie<mininum;chongdie++){
            ok=0;
            for(changshi=1;changshi<=chongdie;changshi++){
                if(x[i-1-chongdie+changshi]==y[changshi-1]) ok=1;
                else { ok=0;break; }//注意该尝试不正确后就立刻退出
            }
            if(ok==1) break;
    }
    if(ok==1) G[m][n].chongd=chongdie;
    return ok;
}
int dfs(int cur,int length){
    length+=strlen(a[cur]);
    int maxl=0,l,ok=0;
    for(int i=1;i<=n;i++){//尝试每个点
        if(vis[i]<2&&G[cur][i].v==1){//如果联通且访问次数小于2
            vis[i]++;ok=1;
            l=dfs(i,length-G[cur][i].chongd);
            if(l>maxl) maxl=l;
            vis[i]--;
        }
    }
    if(ok==0) return length;//注意边界,找不到可以接下去的点了
    else return maxl;
} 
int main(){
    freopen("1018.in","r",stdin);
    freopen("1018.out","w",stdout);
    cin>>n;
    for(int i=1;i<=n;i++) scanf("%s\n",a[i]);//注意读取换行符!
    scanf("%c",&b);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(catchdragon(a[i],a[j],i,j)) G[i][j].v=1;
            //printf("%s %s=%d ",a[i],a[j],G[i][j]);
            //printf("%d ",G[i][j]);
        }
    }
    for(int i=1;i<=n;i++){
        if(b==a[i][0]){
            memset(vis,0,sizeof(vis));
            vis[i]++;
            trytry=dfs(i,0);
            if(trytry>maxn) maxn=trytry;
        }
    }
    printf("%d",maxn);
    return 0;
}

题解:将可接龙的单词构成有向图后进行DFS,注意标记vis

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值