[搜索—深搜] P1019 单词接龙
代码里有注解
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,ans; 4 struct node{ 5 char a[100]; 6 int len,b;//b表示单词用过2次没有 7 }yy[30]; 8 char head; 9 void dfs(int num,int length){//num为前一个单词 10 for(int i=1;i<=n;i++){//i为后一个单词 11 if(yy[i].b<2){//没用过2次 12 int cnt=1,h=1;//h用来表示有没有直接跳过17和22行的判断 13 for(int k=yy[num].len;k>=2;k--){ 14 if(yy[num].a[k]==yy[i].a[cnt]){ 15 if(k!=yy[num].len)//贪心 16 for(int j=k,flag=1;j<=yy[num].len;j++){//循环每个字母 cnt表下一个单词中的位置 17 if(yy[num].a[j]==yy[i].a[cnt]&&flag){ 18 h=2; 19 flag=2; 20 cnt++; 21 } 22 else if(flag==2){//不符合就置0,再找。 ∵可能有envelope 这样两个e的单词 23 h=1; 24 cnt=1; 25 } 26 else h=1; 27 } 28 else h=2,k=1,cnt++;//由于某种玄学原因,cnt++ 29 //好吧其实是 17行内的if语句中,找到一个合适的单词,就cnt++ 30 //而且我设置了35行的+1,就是为了维护cnt++ 31 if(cnt<=yy[i].len&&h!=1){ 32 yy[i].b++; 33 dfs(i,length-cnt+1+yy[i].len); 34 yy[i].b--; 35 } 36 } 37 } 38 } 39 ans=max(ans,length); 40 } 41 return; 42 } 43 int main(){ 44 scanf("%d",&n); 45 for(int i=1;i<=n;i++){ 46 scanf("%s",yy[i].a+1); 47 yy[i].len=strlen(yy[i].a+1); 48 yy[i].b=0; 49 } 50 scanf("\r%c",&head); 51 for(int i=1;i<=n;i++){ 52 if(yy[i].a[1]==head){ 53 yy[i].b++; 54 dfs(i,yy[i].len); 55 yy[i].b--; 56 } 57 } 58 printf("%d",ans); 59 return 0; 60 }

浙公网安备 33010602011771号