• 1172: 单词接龙(XCOJ 暴力DFS)


    1172: 单词接龙

    时间限制: 1 Sec  内存限制: 128 MB
    提交: 12  解决: 5

    题目描述

      单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如 beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at 和 atide 间不能相连。

    输入

      输入的第一行为一个单独的整数n (n<=20)表示单词数,以下n 行每行有一个单词,输入的最后一行为一个单个字符,表示“龙”开头的字母。你可以假定以此字母开头的“龙”一定存在.

    输出

      只需输出以此字母开头的最长的“龙”的长度

    样例输入

    5
    at
    touch
    cheat
    choose
    tact
    a

    样例输出

    23

    提示

    样例中,连成的“龙”为atoucheatactactouchoose

    暴力往下搜索

     1 #include <iostream>
     2 #include <cstring>
     3 #include <algorithm>
     4 #include <cstdio>
     5 using namespace std;
     6 char ch[25][20];
     7 int vis[25];
     8 int n,Max;
     9 int judge(int x,int y)
    10 {
    11     int i,j;
    12     //cout<<ch[x]<<" "<<ch[y]<<endl;
    13     int len1=strlen(ch[x]);
    14     int len2=strlen(ch[y]);
    15     for(i=len1-1;i>=0&&(len1-i)<=len2;i--)
    16     {
    17         int k1=i,k2=0;
    18         for(;k1<len1;k1++,k2++)
    19             if(ch[x][k1]!=ch[y][k2])
    20                 break;
    21         if(k1==len1)
    22         {
    23             if((len1-i)==strlen(ch[y]))
    24                 return 0;
    25             else
    26                 return len1-i;
    27         }
    28     }
    29     return 0;
    30 }
    31 void dfs(int f,int sum)
    32 {
    33     int i,j;
    34     if(sum>Max)
    35         Max=sum;
    36     for(i=1;i<=n;i++)
    37     {
    38         if(vis[i]>=2)
    39             continue;
    40         int ans=judge(f,i);
    41         if(ans!=0)
    42         {
    43             vis[i]++;
    44             //cout<<strlen(ch[i])-ans<<endl;
    45             dfs(i,sum+strlen(ch[i])-ans);
    46             vis[i]--;
    47         }
    48     }
    49     return;
    50 }
    51 int main()
    52 {
    53     int i,j;
    54     freopen("in.txt","r",stdin);
    55     while(scanf("%d",&n)!=EOF)
    56     {
    57         Max=0;
    58         memset(vis,0,sizeof(vis));
    59         for(i=1;i<=n;i++)
    60             scanf("%s",ch[i]);
    61         scanf("%s",ch[0]);
    62         dfs(0,strlen(ch[0]));
    63         printf("%d
    ",Max);
    64     }
    65     return 0;
    66 }
  • 相关阅读:
    图像处理笔记(五)
    图像处理笔记(四)
    图像处理(三)
    图像处理(二)
    图像处理(一)
    Halcon安装注意事项
    Tensorflow从开始到放弃(技术篇)
    Tensorflow从开始到放弃
    python 2.x中的中文
    WPF使用border画框
  • 原文地址:https://www.cnblogs.com/a1225234/p/5285358.html
Copyright © 2020-2023  润新知