0
已采纳
方亦欧
新手光能
新手光能
有些复杂,我也不是太懂,发出来以供参考。
这一题的搜索函数可以设定一个string参数,记为now,表示当前的字符串。
另外,在定义一个int数组vis,判断每一个字符串出现的个数。
循环遍历每个字符串,只要vis数组<2,执行以下操作:
vis[i]++;
定义num变量,存放接龙时重合部分的长度,重合部分的长度用函数canConnect来计算。
判断如果num>0,则递归继续搜索。
回溯,vis--。
函数canConnect:
for(int i=1;i<=(l==1?l:l-1);i++)
{
if(s1.substr(s1.size()-i)==s2.substr(0,i))
return i;
}
这是核心,si和s2表示待接龙的两个字符串,l为长度最短的那个字符串的长度。
函数dfs的核心代码:
for(int i=1;i<=n;i++)
{
if(vis[i]<2)
{
vis[i]++;
int num=canConnect(now,s[i]);
if(num>0)
dfs(now+s[i].substr(num));
vis[i]--;
}
}
或许讲的有错误的地方,仅供参考。
0
栾峻岩
初级天翼
初级天翼
函数:
void dfs(现在的字符串)
{
if (现在的字符串和以前的长度比较) ‘
打擂台。
for (int i=1;i<=n;i++)
{
if (vis[i]<2)
{
vis[i]++;
留下可连接最短长度。
if (num>0)
{
dfs(now+s[i].substr(num));
}
vis[i]--;
}
}
}
判断是否能连接上,能连接上还要判断是否包含,重复长度。
至于 canConnect函数,我只能给你函数部分:
for (int i=1;i<=(l==1?1:l-1);i++)
{
判断重复部分。
}
0
0
0