深搜做法
2025-11-23 10:54:48
发布于:浙江
9阅读
0回复
0点赞
先分析题目:接龙大家都知道是怎么回事;每个单词最多出现两次,那么我们可以用一个数组去存每个单词用了几次;相邻两部分不能有包含关系,其实就是接龙时尽可能用更长的单词,接下来我们就可以开始做了。
1.深搜思路
void dfs(string x){//以当前的龙为状态
取更大的答案(与当前的龙比较)
for(int i=1;i<=n;i++){
if(s[i]可以接&&s[i]使用次数小于2){
s0=要接的部分
s[i]使用次数加1
dfs(x+s0);//如果将s[i]接上
回溯:s[i]使用次数减1
}
}
}
2.如何判断能不能接并找到要接的部分
int check(string a,string b){//b能不能接到a后面,并返回从哪开始接
for(枚举所有b可能跟前面一样的部分){
if(该情况下有一样的部分){
返回从哪开始接
}
}
返回不能接
}
那么大致理解思路之后,我们就可以开始写代码了
下面给出参考代码(简单的大家肯定会写,主要给出check函数的写法)
#include <bits/stdc++.h>
using namespace std;
int n;
string st,s[30];//st-开始字母,s[]-单词
int cnt[30],ans;//cnt[]-次数,ans-答案
int check(string a,string b){
int ls=a.size()-1,len=b.size();
for(int i=0;i<len;i++){
//运用双指针去判断
int pos1=ls,pos2=i;
bool flag=1;
while(pos2>=0){
if(b[pos2]!=a[pos1]){
flag=0;
break;
}
pos1--,pos2--;
}
if(flag) return 从哪接;
}
return 不能接;
返回值自行决定,与后面你自己的代码一致即可
}
void dfs(string x){
判断和取接的部分可以用check函数,其他与前面说的一致
}
int main(){
存入n,s[i],st
dfs(st);
输出结果
return 0;
}
这里空空如也






有帮助,赞一个