题解0004:单词接龙(洛谷P1019)


题目描述:已知一组单词,给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分。

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

题目思路:搜索,从给定单词开始搜,遍历所有单词,将符合要求的单词加上,最终找到最优解,输出。

代码:

#include
using namespace std;
int n,arr[21]={0},maxl=0;
string a[21],b;
bool Q(string s,string m,int k){//判断某单词能不能接上的函数
	for(int i=0;iif(s[s.size()-k+i]!=m[i])//s末尾和m开头比较
			return false;
	}
	return true;
}
void P(string &s,string m,int k){//拼接函数,&s是为了改变s,所以传地址
	for(int i=k;i//可以直接+=
	}
}
void dfs(string p){//搜索函数
	int p_=p.size();
	maxl=max(maxl,p_);//max找出最大值 
	for(int i=1;i<=n;i++){
		if(arr[i]>=2){
			continue;//如果单词用过2遍,直接跳过 
		}
		for(int j=1;j//枚举有多少个单词重合 
			if(Q(p,a[i],j)){
				string temp=p;
				P(temp,a[i],j);
				if(temp==p){//如果单词长度没变,接了个寂寞,跳过 
					continue;
				}
				arr[i]++;
				dfs(temp);
				arr[i]--;//回溯 
			}
		}
	}
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	cin>>b;
	dfs(b);
	cout<

相关