code1018

题目连接:http://codevs.cn/problem/1018/

思路:其实就是一道深搜的题 不过很难写因为都是字母 需要用到很多函数

下面看代码:代码中给了许多注释

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include<string.h>

using namespace std;
int n,con[21][21],visited[21],ans;//visit用来计算每个单词用的次数的  con用来记算重合部分的长度
char dict [21][110],st;   //用来记录每个单词

void lenn(int a,int b)  //这个函数是用来看重合部分的
{
    con[a][b] = 0;
    int min1 = strlen(dict[a]) < strlen(dict[b])?strlen(dict[a]):strlen(dict[b]);
    int w = strlen(dict[a]);
    int y = w - min1;
    for(int temp = 1;temp < min1;temp++)
    {
        if(strncmp(dict[a] + y + temp,dict[b],min1 - temp) == 0)//这个函数的作用是看看两个部分是否相同如果相同的话就返回了0
        {
            con[a][b] = min1 - temp;
        }
    }
    return;
}
void dfs(int a,int len)//  这个是深搜函数
{
    int flag = 1;
    for(int i = 1;i <= n;i++)
    {
        if(con[a][i]&&visited[i] < 2)
        {
            visited[i]++;
            dfs(i,len + strlen(dict[i]) - con[a][i]); //这个长度是要变化的
            visited[i]--;
            flag = 0;
        }
    }
    if(flag)
    {
        if(len > ans)
            ans = len;
    }
}

int main()

{
    scanf("%d",&n);
    for(int i = 1;i <= n;i++)
    {
        scanf("%s\n",dict[i]);
    }
    scanf ("%c",&st);
    for(int i = 1;i <= n;i++)
    {
        for(int j = 1;j <= n;j++)
        {
            lenn(i,j);
        }
    }
    for (int i=1;i<=n;i++)
    {
        if (dict[i][0]==st)
        {
            memset(visited,0,sizeof(visited));
            visited[i]++;
            dfs(i,strlen(dict[i]));
        }
    }
    printf("%d\n",ans);
    return 0;
}
时间: 2024-10-24 00:16:43

code1018的相关文章