#include<iostream>
#include<queue>
#include<string.h>
using namespace std;
struct word {
char s[500] = {};
int count[25] = {};
int okk = 0;
};//储存每个接龙结果
word beg[25] = {};
queue < word > Q;//队列储存每个接龙结果
int check(char s1[], char s2[]) {//判断两个字符串能不能接龙
int len = strlen(s1);
int okk = 1;
for (int i = len - 1; i >= 1; i--) {
okk = i;
for (int j = i; j < len ; j++) {
if (s1[j] != s2[j - i]) {
okk = 0;
break;
}
}
if (okk!=0) {
return okk;//返回字符串重合点位置,便于接龙
}
}
return 0;
}
int main(void) {
int n = 0, maxl = 0;
char dra_he='\0';
cin >> n;
for (int i = 0; i <n; i++) {//读取
cin >> beg[i].s;
}
cin >> dra_he;//读取
for (int i = 0; i < n; i++) {//锁定第一批能进行接龙的首单词
if (beg[i].s[0] == dra_he) {
beg[i].count[i]++;//记录每个单词出现次数
Q.push(beg[i]);
}
}
while (!Q.empty()) {
int flag = 0;
word tmp = Q.front();
for (int i = 0; i < n; i++) {
if (tmp.count[i] >= 2) {
continue;//出现两次不能继续
}
else {
if (check(tmp.s, beg[i].s) > 0) {//可以接龙就储存
word tmp2 = tmp;
for (int t=check(tmp2.s,beg[i].s),j=0;j<strlen(beg[i].s);j++,t++) {
tmp2.s[t] = beg[i].s[j];
}
tmp2.count[i]++;//计数
Q.push(tmp2);//加入队列
flag = 1;//表明该段字符串还能利用
}
}
}
if (flag == 0) {
maxl = maxl > strlen(tmp.s) ? maxl : strlen(tmp.s);//更新最大值
}
Q.pop();//清除队首
}
cout << maxl;//输出
return 0;
}
对题目有一些思考,希望有帮助(也许本人方法麻烦难懂,希望佬不喷)