[搜索—深搜] 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 }

 

posted @ 2019-09-29 10:23  Mr_QL  阅读(155)  评论(0)    收藏  举报