1. 程式人生 > >單次接龍dfs洛谷

單次接龍dfs洛谷

strong 目前 -s 否則 amp 字符串 n) define scan

題目傳送門:https://www.luogu.org/problem/show?pid=1019#sub

典型的爆搜,每次更新最大龍長度即可

搜索每個字符串編號,與已經連接好的字符串進行比較,以此往後找,若全部匹配,則可以接龍

註意:

1.自己也可以與自己相連

2.題目中所說的不能存在包含關系是連接好後的相鄰兩部分 並不是如果是子串就不能連接 否則第一個單詞即起始字母無法連接

//Gang
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include
<cstdlib> #include<cmath> #define FOR(x,y,z) for(int x=y;x<=z;x++) #define ll long long struct node { int l,vis; char s[25]; } c[25]; int n,maxn=0; using namespace std; void dfs(int x,int l)//x為當前連接好的單詞的最後一個單詞,l為 目前龍的長度 { FOR(i,1,n)//枚舉每個單詞的編號 { if(c[i].vis<2
)//一個單詞最多被用兩次 FOR(j,0,c[x].l) { if(c[x].s[j]==c[i].s[0]) { int k=1; bool flag=1; for(int d=j+1; d<c[x].l&&k<c[i].l; k++,d++) { if(c[x].s[d]!=c[i].s[k]) { flag
=0; break; } } if(flag) { c[i].vis++; dfs(i,l+c[i].l-k); c[i].vis--; } } } } if(l>maxn)maxn=l; } int main() { scanf("%d",&n); FOR(i,1,n) { scanf("%s",c[i].s); c[i].l=strlen(c[i].s); } scanf("%s",c[0].s); c[0].l=strlen(c[0].s); dfs(0,c[0].l); printf("%d",maxn); return 0; }

單次接龍dfs洛谷