P1109单词接龙

一.题目描述:

 

 二.题目解析:

刚开始一直以为最多只有两个相同个输入字符串,后来意识到看错题了,就开始改,第一遍写重叠个数那个循环的时候从尾巴到头,全wa,第二遍写从头到尾,对三个T三个,第三遍写了个剪枝ac,这个题的思路其实是很简单的,只是实现的时候比较复杂,然后容易出错(调了两个小时)>0<!这题主要是注意到一个贪心策略,找重叠最小的加上去长度才会是最大的,所以我们写循环就要从头到尾巴。然后要注意的是当你的长度和你加上去的长度一样时,其实这一步是没有必要的,所以可以剪掉,不然T3个点。

三.代码实现:

 1 #include "bits/stdc++.h"
 2 using namespace std;
 3 string s[30];
 4 int bk[100];
 5 int n,mlen = 0;
 6 bool jdg(string a,string b,int z)//计算重叠
 7 {
 8     int i,j;
 9     for(i = a.length() - 1,j = z - 1;i >= 0 && j >= 0;j--,i--)
10         if(a[i] != b[j]) return false;
11     return true;
12 }
13 void dfs(string ans)
14 {
15     int num = ans.length();
16     mlen = max(mlen,num);
17     for(int i = 0;i < n;i++){
18         if(bk[i] < 2){
19             string temp = ans;
20             int z;
21             for(z = 1;z < s[i].length();z++)
22                 if(jdg(temp,s[i],z)) break;
23             for(int l = z;l <= s[i].length() - 1;l++)  temp += s[i][l];
24             if(temp.length() == ans.length()) continue;
25             bk[i]++;
26             dfs(temp);
27             bk[i]--;
28         }
29     }
30 }
31 int main()
32 {
33     cin >> n;
34     char c;
35     for(int i = 0;i < n;i++)
36         cin >> s[i];
37     cin >> c;
38     string t;
39     dfs(t + c);
40     cout << mlen << endl;
41     return 0;
42 }

 

posted @ 2022-01-10 22:05  scannerkk  阅读(32)  评论(0编辑  收藏  举报