• 89 单词接龙


    89 单词接龙

    作者: Turbo时间限制: 1S章节: 深度优先搜索

    问题描述 :

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

    样例输入
      5
      at
      touch
      cheat
      choose
      tact
      a

    样例输出

      23
    

    样例说明

      连成的“龙”为atoucheatactactouchoose

    输入说明 :

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

    输出说明 :

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

    输入范例 :
    5
    at
    touch
    cheat
    choose
    tact
    a
    输出范例 :
    23

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <string>
    #include <algorithm>
    using namespace std;
    const int maxn = 100;
    int n;
    int res = 0;   //拼接结果
    string word[maxn]; //字符串数组 存放单词
    string beginn;        //用来存储开头字符
    int used[maxn];     // 记录dfs时每个单词使用次数
    
    bool check(string s, string m, int k)
    {
    	int lens = (int)s.length();
    	for (int i = 0; i < k; i++)//k为接口的长度
    	{
    		if (s[lens - k + i] != m[i])
    			return false;
    	}
    	return true;
    }
    
    void add(string &tmp, string m, int k)
    {
    	int lenm = (int)m.length();
    	for (int i = k; i < lenm; i++)//从k开始拼接
    	{
    		tmp += m[i];
    	}
    }
    
    void dfs(string str)
    {
    	int len = (int)str.length();
    	res = max(res, len);//每次更新当前以拼接好的字符串长度
    	for (int i = 1; i <= n; i++)
    	{
    		if (used[i] >= 2) continue;
    		int maxlink = (int)word[i].length();//最大接口长度是当前所选单词的长度
    		for (int j = 1; j <= maxlink; j++)
    		{
    			if (check(str, word[i], j))
    			{
    				string  tmp = str;
    				add(tmp, word[i], j);//将Word【i】字符拼接到tmp中
    				if (tmp == str) continue;
    				used[i]++;
    				dfs(tmp);
    				used[i]--;
    			}
    			//else
    			//	break;
    		}
    	}
    }
    
    int main()
    {
    	cin >> n;
    	for (int i = 1; i <= n; i++)
    	{
    		cin >> word[i];
    	}
    	cin >> beginn;
    	dfs(beginn);
    
    	cout << res << endl;
    	return 0;
    }
    
    
    
    Yesterday is history,tomorrow ismystery,but today is a gift!That why it is called Present!
  • 相关阅读:
    DataAdapter的Fill方法(转)
    C#读取xml节点数据方法小结
    Service-Oriented Architecture,SOA(转)
    SOAP详解(转)
    WebService到底是什么?(转)
    只需要2个工具,百度云盘大文件就能用迅雷和IDM下载
    刘铁猛-深入浅出WPF-系列资源汇总
    WCF书籍
    书籍:wpf学习书籍介绍
    在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器(转)
  • 原文地址:https://www.cnblogs.com/VictorierJwr/p/12878473.html
Copyright © 2020-2023  润新知