洛谷 P1019 单词接龙 题解

久未见 提交于 2020-02-13 22:14:17

题目链接https://www.luogu.com.cn/problem/P1019

最短代码

思路各位大佬都已经讲的很清楚了,本蒟蒻就不在赘述。

大家主要还是不知道如何接龙,这里我将用一个神奇的方法缩短代码
(好吧其实就是介绍一个函数

正式开始

substr函数(请开始你的表演

这个函数有什么用呢(听名字显然是找子字符串

函数原型substr(pos,count)

pos - 要包含的首个字符的位置

count - 子串的长度

就是直接截取pos到pos+count-1的部分作为字符串

举个栗子

string a=“0123456789”;

string b=a.substr(5,2);

b就是“56” 注意pos的位置相当于从左往右数第六个开始不是第五个开始

当然作为神奇的函数他当然还有另一个用法(没想到吧

可以直接省掉后面那个参数,一直到截取到最后即可

继续举个栗子

string a=“0123456789”;

string b=a.substr(5);

b就是“56789”

下面是44行未压缩代码

#include<bits/stdc++.h>
using namespace std;
int n,i,j,k,prime[30],ans;
char ch;
string s[20];
void dfs(string x,int len)//x表示上一次的字符串,len表示总长度
{
   ans=max(ans,len);//更新最大值
   for(int i=1;i<=n;i++)
   {
       int len1=x.length(),len2=s[i].length();
       for(int j=1;j<min(len1,len2);j++)//因为题目要求不能重合
       {
           if(x.substr(len1-j)==s[i].substr(0,j)&&prime[i]<2)//运用函数,prime[i]为判断数组不能使用两次
           {
               prime[i]++;
               dfs(s[i],len+len2-j);
               prime[i]--;
               break;
           }
       }
   }
    return ;
}
int main()
{
    cin>>n;
    for(i=1;i<=n;i++)
    {
        cin>>s[i];
    }
    cin>>ch;
    for(i=1;i<=n;i++)
    {
        if(s[i][0]==ch)//如果第一个字符是ch开始dfs
        {
            prime[i]++;
            dfs(s[i],s[i].size());
            prime[i]--;
        }
    }
    cout<<ans;
    return 0;
}

蒟蒻第一篇题解,点个赞再走呗(逃

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!