问题标题: 1400 接龙游戏

0
1

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
我要回答