单词接龙

2016-10-07  本文已影响0人  Sari

10.06 [codevs] 单词接龙题记

题目:

题目描述 Description

单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at和atide间不能相连。

输入描述 Input Description

输入的第一行为一个单独的整数n(n<=20)表示单词数,以下n行每行有一个单词,输入的最后一行为一个单个字符,表示“龙”开头的字母。你可以假定以此字母开头的“龙”一定存在.

输出描述 Output Description

只需输出以此字母开头的最长的“龙”的长度

样例输入 Sample Input

5
at
touch
cheat
choose
tact
a

样例输出 Sample Output

23

0.简记

算是第一个自己完成的有一点难度的题目qwq,中途犯了很多奇怪且脑残的错误,
原先的习惯一直是把它们记纸上,既然入了贵系坑,习惯也要渐渐改过来嘛qwq。
再加上代码记纸上实在是懒得写,字也不好看。。。

1.错误

0.审题

忘记是求最长串;
忘记了两次的限制;

1.return -1的位置放错

逻辑混乱

2.知识点

dfs
回溯
字符串处理

3.进步

熟练使用注释调试法

4.代码

#include <string>
#include <iostream>
using namespace std;
int used[20];
string word[20];
string beg;
int maxlen=0;
int tlen=1;
int n;

int check(string a,string b)
{
    int len1=a.size(),len2=b.size();
    for (int i=1;i<=len1;i++)
    {
        if (a.substr(len1-i,i)==b.substr(0,i))
        {
            return len2-i;
        }
    }
    return -1;
}
void dfs (string s)
{
    for (int i=0;i<n;i++)
    {
        if (used[i]!=2)
        {
            if (check(s,word[i])>0)
            {
                tlen += check(s, word[i]);
                used[i]++;
                maxlen=max (maxlen,tlen);
                dfs (word[i]);
                used[i]--;
                tlen -= check(s, word[i]);
            }
        }
    }
}
int main() {
    for (int i=0;i<n;i++)
    {
        used[i]=0;
    }
    cin >>n;
    for (int i=0;i<n;i++)
    {
        cin >>word[i];
    }
    cin >>beg;
    dfs (beg);
    cout << maxlen;

    return 0;
}
上一篇下一篇

猜你喜欢

热点阅读