题解 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;
}
posted @ 2019-11-11 17:17  贰冬  阅读(163)  评论(0)    收藏  举报