题解 P1019 【单词接龙】

这道题挺有意思,没看见怎么用substr的,来发一波。

首先,我们的知道substr的一种用法,比较多的都是两个参数,但其实,一个参数也可以。
如下:

我们在此处用的就是第1种方法。
### 不过要注意,一个单词只能用两次,一开始没看见,狂交10次。
所以我们要定义一个数组来看它是否被用了超过两次以上。
DFS与回溯。

如下:

#include<bits/stdc++.h>
using namespace std;
int maxlen=0;
int newlen=0;
int n;
string str[22];
int ok[22];//判断是否出现了2次。 
int pipei(string &str1,string &str2) {
   if(str1.length()==1) {
       if(str2[0]==str1[0])
           return str2.length();//如果是开头的字母就直接返回准备匹配的单词的长度 
       return 0;
   } else {
       for(int i=1; i<str1.length(); i++) {
           string temp1=str1.substr(str1.length()-i);//substr如果只有一个参数,返回从参数开始到结尾 
           string temp2=str2.substr(0,i);
           if(temp1==temp2)
               return str2.length()-i;//如果相等,传回长度 
       }
   }
   return 0;
}
void dfs(string &s) {//取地址符号以改变原来的字符串。 
   for(int i=0; i<n; i++) {
       int temp=pipei(s,str[i]);//pipei中传回的是新的长度 
       if(temp && ok[i]<2) {
           ok[i]++;
           newlen+=temp;
           if(newlen>maxlen) maxlen=newlen;//改变长度 
           dfs(str[i]);
           ok[i]--;
           newlen-=temp;//回溯 
       }
   }
}
int main() {
   cin>>n;
   for(int i=0; i<n; i++)
       cin>>str[i];
   string cr;
   cin>>cr;//开头首字母。 
   dfs(cr);
   cout<<maxlen<<endl;
   return 0;
}

猜你喜欢

转载自www.cnblogs.com/Fast-Bird/p/11836827.html