codevs1018单词接龙 lsj版+注释

来源:互联网 发布:淘宝天猫分销平台 编辑:程序博客网 时间:2024/06/06 09:50

深度优先搜索,回溯

#include<iostream>#include<string>using namespace std;int n,b[21],num,sum;//b是判重用的,num是最终输出的最长串,sum是目前串长度 string a[21];       //char c;             //头 int dfs(char x,string s)//上一串的尾字符和上一个单词 {    if(sum>num)    num=sum;    for(int i=1;i<=n;i++)    {        for(int j=0;j<a[i].size();j++)        {            if(a[i][j]==x)             //如果该串中可能有与上串重合部分             {                int flag=0;            //判定                 int ii=s.size();       //见下文s[--ii]                 for(int k=j;k>=0;k--)                  {                                          if(a[i][k]!=s[--ii])                     flag=1;            //如果不匹配则flag=1                   }                 if(!flag&&b[i]<2)      //如果尾字符前部分完全匹配                 {                    sum+=a[i].size()-j-1;//                    b[i]++;              //同main函数中的搜索                     dfs(a[i][a[i].size()-1],a[i]);                    sum-=a[i].size()-j-1;                    b[i]--;                }            }        }    }}int main(){    cin>>n;    for(int i=1;i<=n;i++)    {        cin>>a[i];    }    cin>>c;               //头     for(int i=1;i<=n;i++)    {        if(a[i][0]==c)        {            b[i]++;            sum+=a[i].size();            dfs(a[i][a[i].size()-1],a[i]);            sum-=a[i].size();//回溯             b[i]--;          //回溯         }    }    cout<<num;}