zoukankan      html  css  js  c++  java
  • P1019 单词接龙

    题目描述

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

    输入输出格式

    输入格式:

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

    输出格式:

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

    输入输出样例

    输入样例#1:
    5
    at
    touch
    cheat
    choose
    tact
    a
    
    输出样例#1:
    23           (连成的“龙”为atoucheatactactouchoose)   

    说明

    NOIp2000提高组第三题

    思路:暴力枚举每一个以给定字母开头的字符串,然后开始搜索,在搜索判断是否相重的时候可以找出当前字符串(龙)的最后一个字符

    然后再在将要比较的字符串里暴力找,如果能找到,再从当前位置往前找。如果直到将要比较的字符串全部比较完且全部相同,就加到龙里面

    易错点:

    1.可以无视题目中的at与atite的相互包含问题

    2.不要忽视自身和自身相连的情况

    3.注意龙和其长度和使用情况的初始值!!

    4.注意+1-1的边界问题!!

    5.如果你还没有做这个题,那么请先手推样例

    跟大家说一个这个题调试中的小技巧:

    如果你每次搜索都把龙输出一下会让你的调试更简单

    我的代码形式比较简单,但是可能有些绕,用样例跑一边你肯定能明白

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cmath>
     5 using namespace std;
     6 int n;
     7 string a[50];
     8 int use[50];// 每个数的使用情况 
     9 char bg;
    10 int ans;
    11 int now;
    12 string kk;// 已经找到的龙 
    13 string kong;
    14 void dfs(int p)
    15 {
    16     //cout<<kk<<" "<<now<<endl;
    17     ans=max(ans,now);
    18     int lp=a[p].length();
    19     char last=a[p][lp-1];
    20     for(int i=1;i<=n;i++)//遍历所有的字符串 
    21     {
    22         if(use[i]<2)
    23         {
    24             int li=a[i].length();// 将要查找的字符串的长度 
    25             for(int j=0;j<li;j++)
    26             {
    27                 if(a[i][j]==last)//i个字符串的第j位 
    28                 {
    29                     int flag=0;// 判断是否相等 
    30                     int num=0;
    31                     for(int k=j;k>=0;k--)
    32                     {
    33                         char d,q;
    34                         d=a[p][lp-(num)-1];
    35                         q=a[i][j-(num)];
    36                         num++;
    37                         if(d==q)continue;
    38                         else {flag=1;break;}
    39                     }
    40                     if(flag==0)
    41                     {
    42                         use[i]++;
    43                         now=kk.length()+li-num;
    44                         kk.erase(kk.end()-num,kk.end());
    45                         kk=kk+a[i];
    46                         dfs(i);
    47                         now=kk.length()-li+num;
    48                         kk.erase(kk.end()-li+num,kk.end());
    49                         use[i]--;
    50                     }
    51                 }
    52             }
    53         }
    54     }
    55 }
    56 int main()
    57 {
    58     scanf("%d",&n);
    59     for(int i=1;i<=n;i++)
    60         cin>>a[i];
    61     cin>>bg;
    62     for(int i=1;i<=n;i++)
    63     {
    64         if(a[i][0]==bg)
    65         {
    66             kk=kong;
    67             now=0;
    68             memset(use,0,sizeof(use));
    69             now=now+a[i].length();
    70             use[i]++;
    71             kk=kk+a[i];
    72             dfs(i);
    73         }
    74     }
    75     printf("%d",ans);
    76     return 0;
    77 }
  • 相关阅读:
    Linux下sed,awk,grep,cut,find学习笔记
    Python文件处理(1)
    KMP详解
    Java引用详解
    解决安卓中页脚被输入法顶起的问题
    解决swfupload上传控件文件名中文乱码问题 三种方法 flash及最新版本11.8.800.168
    null id in entry (don't flush the Session after an exception occurs)
    HQL中的Like查询需要注意的地方
    spring mvc controller间跳转 重定向 传参
    node to traverse cannot be null!
  • 原文地址:https://www.cnblogs.com/zwfymqz/p/6857565.html
Copyright © 2011-2022 走看看