蓝桥杯--单词接龙--dfs

 

  算法训练 单词接龙  
时间限制:1.0s   内存限制:256.0MB
      
问题描述 

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

入格式 

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

出格式 

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

例输入
  5
  at
  touch
  cheat
  choose
  tact
  a
样例输出
23
样例说明
  连成的“龙”为atoucheatactactouchoose
 


思路:
    使用string str[]数组存储单词,visit[]数组标志单词是否被访问过,MAX存放最大长度。
    然后dfs每一个单词,如果compare()返回不等于-1,则将此单词不同的字符加到龙上,将该单词的访问加1,则dfs下一个单词并将值传入,将长度lenth与MAX进行比较,大的值赋给MAX,并将此时接龙的长度和此时的字符串向下传递,一次深度遍历结束,将该单词的访问减1;



#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
#define number 20
int N;  //输入单词数
int MAX = 0,visit[number+5];
string str[number+5];

//思路: 用龙尾单词的最后一个字母去和当前单词字母逐一进行比较,直至找到相同且此时小于l,然后从j = i逐一向前进行比较直至j=0都相同则返回i
int compare(int tail,int loc)   //比较两个单词是否可以接龙,如果可以返回单词相同的字母数,如果包含或没有相同的字母则无法接龙
{
    string stail,sloc;
    stail = str[tail];
    sloc = str[loc];
    int l = min(stail.length(),sloc.length());
    int i;
    if(l == 1)
    {
        if(stail[0] == sloc[0])
            return 1;
    }
    else{
        for(i=0;i<l-1;i++)
        {
            if(stail[stail.length()-1]==sloc[i])
            {
                int j;
                for(j = i;j>=0;j--)
                    {
                        if(stail[stail.length()-1-i+j]!=sloc[j])
                            break;
                    }
                if(j == -1) return i+1;
            }
        }
    }
    return -1;
}

void init()
{
    for(int i=0;i<=N;i++)
    {
        visit[i] = 0;
        cin>>str[i];
    }
}

void dfs(string dragon1,int tail)   //初始龙为存放字符数组下标为N处单词
{
    for(int i=0;i<N;i++)
    {
        if(visit[i] < 2)
        {
            int sameL = compare(tail,i);
            if(sameL != -1)
            {
                string dragon2 ;
                dragon2 = dragon1;
                visit[i]++;
                string t = str[i];
                int l = t.length();
                t = t.substr(sameL);   // c++11标准
                dragon2.append(t);
                MAX = dragon2.length()>MAX? dragon2.length():MAX;
                dfs(dragon2,i);
                visit[i]--;
            }
        }

    }
}

int main()
{
    cin>>N;
    init();
    MAX = str[N].length();
    dfs(str[N],N);
    cout<<MAX;
    return 0;
}

 


int main()
{
cin>>N;
init();
MAX = str[N].length();
dfs(str[N],N);
cout<<MAX;
return 0;
}

 

 
posted @ 2018-02-09 00:57  dessert^-^  阅读(292)  评论(0编辑  收藏  举报