单次接龙dfs洛谷
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单次接龙dfs洛谷相关的知识,希望对你有一定的参考价值。
题目传送门: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洛谷的主要内容,如果未能解决你的问题,请参考以下文章