pku2138

本文介绍了一种使用广度优先搜索算法来寻找从指定起点出发,每次仅增加一个字母且始终保持在给定单词列表中的最长单词路径的方法。通过队列实现算法,并对单词按长度排序以提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给定一组单词,和一个起始单词,寻找有该单词每次添加一个字母都能构成该单词组中的某个单词,求能够成的最长的单词。采用队列实现的广搜方法,先将单词按长度排列,从起始单词的长度开始,对于每一个可能的单词放入队列,然后从长度比它大一的单词中找是否存在有它构成的,有放入序列,继续,直到队列为空。

Source:

 

#include<map>
#include
<queue>
#include
<string>
#include
<algorithm>
#include
<iostream>
using namespace std;

int cmp(const void *a,const void *b);

int mx;
string sa,str,res;
string data[1010];
map
<string,bool> dic;
queue
<string> q;

int main()
{
    
int i,j,k,len,ls,le,n;
    
string c;
    
    cin
>>n>>sa;
    
for(i=0;i<n;++i)
    {
        cin
>>str;
        dic[str]
=false;
        data[i]
=str;
    }
    qsort(data,n,
sizeof(string),cmp);
//    for(i=0;i<n;++i)cout<<data[i]<<endl;
    q.push(sa);
    mx
=0;
    
    
while(!q.empty())
    {
        c
=q.front();
        len
=c.length();
//        cout<<c<<endl;
        if(len>mx)
        {
            mx
=len;
            res
=c;
        }
        q.pop();
        len
++;
        
for(ls=0;ls<&& data[ls].length()<len;++ls);
        
for(le=ls;le<&& data[ls].length()==len;++le);
        
for(i=ls;i<le;++i)
        {
            
if(dic[data[i]])continue;
            
for(j=0,k=0;j<len+1;++j)
            {
                
if(data[i][j]==c[k])++k;
            }
            
if(k==len)
            {
                q.push(data[i]);
                dic[data[i]]
=true;
            }
        }
    }
    cout
<<res<<endl;
    
    
return  0;
}

int cmp(const void *a,const void *b)
{
    
return (*((string*)a)).length()-(*((string*)b)).length();
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值