先判断这些单词能不能构成 接龙 , 能的话在排序 , 然后深搜确定接龙 .

题解 : 如果先确定所有单词的首尾字母的个数 , 如果首字母个数等于尾字母个数就不用管了 , 如果发现首字母比尾字母大1那个这个单词就是首位单词 , 末尾单词也是这样确定 , 如果发现有两个首尾的话  那么就不可能接龙成功  ,  如果成环的话 从字典序小的 单词里面找一个字母 , 排序 , 开始深搜  ,

  1 #include<stdio.h>
  2 #include<string.h>
  3 #include<math.h>
  4 #include<iostream>
  5 #include<limits.h>
  6 #include<algorithm>
  7 #include<queue>
  8 #include<vector>
  9 #include<set>
 10 #include<stack>
 11 #include<string>
 12 #include<sstream>
 13 #include<map>
 14 #include<cctype>
 15 using namespace std;
 16 struct node
 17 {
 18     char s[31];
 19     int first,last;
 20 }a[1001];
 21 int n,degree_in[1001],degree_out[1001],order[1001],visited[1001];
 22 bool cmp(node a,node b)
 23 {
 24     return strcmp(a.s,b.s)<0;
 25 }
 26 int check()
 27 {
 28     int x1,x2,ans=0,i;
 29     x1=x2=0;
 30     for(i=0;i<26;++i)
 31     {
 32         if(abs(degree_in[i]-degree_out[i])>=2)
 33             return -1;
 34         else if(degree_in[i]-degree_out[i]==1)
 35             x1++;
 36         else if(degree_in[i]-degree_out[i]==-1)
 37         {
 38             x2++;
 39             ans=i;
 40         }
 41     }
 42         if(x1>1||x2>1) //当时三个度时,必定是 12 和21,相同的不能大于等于2,不然不能构成欧拉回路
 43             return -1;
 44         else if(x1==0)
 45         {
 46             for(i=0;i<26;++i)
 47                 if(degree_out[i])
 48                     return i; //找到一个就行
 49         }
 50         else
 51             return ans;
 52 }
 53 bool DFS(int st,int cnt)
 54 {
 55     int i;
 56     if(cnt==n)
 57         return 1;
 58     for(i=0;i<n;++i)
 59     {
 60         if(a[i].first<st||visited[i])
 61             continue;
 62         else if(a[i].first>st)
 63             return false;
 64         visited[i]=true;
 65         order[cnt]=i;
 66         if(DFS(a[i].last,cnt+1))
 67             return 1;
 68         visited[i]=false;//回溯判断是否形成欧拉路径
 69     }
 70     return false;
 71 }
 72 int main()
 73 {
 74     int t;
 75     scanf("%d",&t);
 76     while(t--)
 77     {
 78         for(int i=0;i<1001;i++)
 79         {
 80             degree_in[i]=degree_out[i]=visited[i]=0;    // 比 三个 memset 要快
 81         }
 82         scanf("%d",&n);
 83         for(int i=0;i<n;i++)
 84         {
 85             scanf("%s",a[i].s);
 86             int len=strlen(a[i].s);
 87             a[i].first=a[i].s[0]-'a';
 88             a[i].last=a[i].s[len-1]-'a';
 89             degree_out[a[i].s[0]-'a']++;
 90             degree_in[a[i].s[len-1]-'a']++;
 91         }
 92         int flag=check();
 93         if(flag==-1)
 94         {
 95             printf("***\n");
 96             continue;
 97         }
 98         sort(a,a+n,cmp);
 99         if(!DFS(flag,0))
100         {
101             printf("***\n");
102             continue;
103         }
104         printf("%s",a[order[0]].s);
105         for(int i=1;i<n;i++)
106             printf(".%s",a[order[i]].s);
107         printf("\n");
108     }
109     return 0;
110 }

转载于:https://www.cnblogs.com/A-FM/p/5394324.html

单词拼接 ----- 深搜相关推荐

  1. NYOJ-99 单词拼接(欧拉+回溯)

    单词拼接 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 描述 给你一些单词,请你判断能否把它们首尾串起来串成一串. 前一个单词的结尾应该与下一个单词的道字母相同. 如 alo ...

  2. 深搜、广搜、搜索剪枝

    搜索与回溯讲解 文章目录 深搜 方向向量: DFS代码: 题目讲解: 八皇后问题 字符序列 自然数的拆分 广搜 BFS代码: 题目讲解: 瓷砖 关系网络 bfs与dfs的用途与区别 搜索剪枝 可行性剪 ...

  3. 蘑菇街校招-possible sentences(搜索(深搜)、双指针)

    时间限制:1秒 空间限制:32768K 热度指数:174 本题知识点: Java工程师 C++工程师 蘑菇街 字符串 模拟 穷举 题目描述 Given a string s and a diction ...

  4. Go 分布式学习利器(15) -- Go 实现 深搜和广搜

    强化语法,回顾算法. 通过Go语言实现 深度优先搜索 和 广度优先搜索,来查找社交网络中的三度好友关系(三度指的是一个节点到 其相邻节点 到 其相邻节点的节点 ,图递增三层好友关系). 涉及到的Go语 ...

  5. 水管工游戏 (深搜)

    水管工游戏 本题依然是采用搜索,深搜,广搜都可以,本代码采用深搜,此题在搜索时需要增加一些判断条件以及下一步要搜索的位置即可. 代码如下: #include<stdio.h> int a[ ...

  6. Poj(2488),按照字典序深搜

    题目链接:http://poj.org/problem?id=2488 思路:按照一定的字典序深搜,当时我的想法是把所有的可行的路径都找出来,然后字典序排序. 后来,凡哥说可以在搜索路径的时候就按照字 ...

  7. [数据结构] 迷宫问题(栈和队列,深搜和广搜)

    代码: #include <iostream> #include <string.h> #include <stack> #include <queue> ...

  8. 迷宫问题最短捷径c语言深搜,迷宫问题 C语言实现(深搜)

    问题描述: 2015年05月21日 10:24:05 这是我自己出的一道题   其原型基于迷宫问题,用深搜来解决的!我就简单的说一说吧! 给定一个N * M 的迷宫!,1代表有障碍,0代表无障碍可通行 ...

  9. POJ-1724 深搜剪枝

    这道题目如果数据很小的话.我们通过这个dfs就可以完成深搜: void dfs(int s) {if (s==N){minLen=min(minLen,totalLen);return ;}for ( ...

最新文章

  1. mysql存储过程语法及实例
  2. 科技部部长:基础研究是科技创新“总开关”
  3. 利用FreeNas创建WebDAV共享并实现ssl加密
  4. Data Partitioning Guidance
  5. python自动化测试看什么书-Python接口自动化测试
  6. Python常见问题(1):来历与简介General Python FAQ
  7. Linux16.04下配置Caffe,Pycaffe,matcaffe
  8. 2020恩智浦智能车大赛规则_2020年世界人工智能围棋大赛落幕,各路围棋AI共同论道...
  9. springBoot学习(二) 基础运行原理
  10. ajax怎么在html与php中使用,php – 如何在通过ajax加载的html中运行javascript
  11. Python3的编码问题
  12. 计算机的需求配置,软件最佳运行对计算机配置最低要求怎样?
  13. 新服务器如何安装操作系统,新服务器如何安装操作系统
  14. mysql排序后如何取最前和最后的数据_天天写order by,你知道Mysql底层如何执行吗?...
  15. 第七次全国人口普查公报[1](第六号) ——人口受教育情况
  16. nyoj 779 兰州烧饼
  17. FPGA复位电路设计学习分析
  18. 381个Android开源项目
  19. 最齐全的Cocos2D Cocos creator Cocos2Dx游戏源代码素材,速来收藏
  20. 全志D1-H芯片 如何在tina使用tplayerdemo 进行rtsp拉流说明?

热门文章

  1. 【转】Matlab中特殊符号的写法
  2. DB2中导出数据库的所有DDL脚本
  3. 【错误记录】GitHub 网站和仓库无法访问 ( 域名重定向 | 检查 C:\Windows\System32\drivers\etc\hosts 配置文件中的 GitHub 地址域名配置 )
  4. 【Git】Git 分支管理 ( 解决分支合并冲突 | 创建并切换分支 git switch -c feature1 | 修改 feature1 分支并提交 | 修改 master 主版本并提交 )
  5. 【运筹学】线性规划 单纯形法 案例二 ( 第一次迭代 | 矩阵变换 | 检验数计算 | 最优解判定 | 入基变量 | 出基变量 )
  6. 【UML 建模】UML建模语言入门 -- 静态图详解 类图 对象图 包图 静态图建模实战
  7. 巧妙使用网页在线工具,让您的工作更简单
  8. String 课后作业2
  9. javascript:void(0)与#区别
  10. android logger的使用