蓝桥杯--单词接龙--dfs
算法训练 单词接龙
时间限制:1.0s 内存限制:256.0MB
问题描述
单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如 beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at 和 atide 间不能相连。
输入格式
输入的第一行为一个单独的整数n (n<=20)表示单词数,以下n 行每行有一个单词,输入的最后一行为一个单个字符,表示“龙”开头的字母。你可以假定以此字母开头的“龙”一定存在.
输出格式
只需输出以此字母开头的最长的“龙”的长度
样例输入
5
at
touch
cheat
choose
tact
a
单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如 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;
}