单词拼接 ----- 深搜
先判断这些单词能不能构成 接龙 , 能的话在排序 , 然后深搜确定接龙 .
题解 : 如果先确定所有单词的首尾字母的个数 , 如果首字母个数等于尾字母个数就不用管了 , 如果发现首字母比尾字母大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
单词拼接 ----- 深搜相关推荐
- NYOJ-99 单词拼接(欧拉+回溯)
单词拼接 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描述 给你一些单词,请你判断能否把它们首尾串起来串成一串. 前一个单词的结尾应该与下一个单词的道字母相同. 如 alo ...
- 深搜、广搜、搜索剪枝
搜索与回溯讲解 文章目录 深搜 方向向量: DFS代码: 题目讲解: 八皇后问题 字符序列 自然数的拆分 广搜 BFS代码: 题目讲解: 瓷砖 关系网络 bfs与dfs的用途与区别 搜索剪枝 可行性剪 ...
- 蘑菇街校招-possible sentences(搜索(深搜)、双指针)
时间限制:1秒 空间限制:32768K 热度指数:174 本题知识点: Java工程师 C++工程师 蘑菇街 字符串 模拟 穷举 题目描述 Given a string s and a diction ...
- Go 分布式学习利器(15) -- Go 实现 深搜和广搜
强化语法,回顾算法. 通过Go语言实现 深度优先搜索 和 广度优先搜索,来查找社交网络中的三度好友关系(三度指的是一个节点到 其相邻节点 到 其相邻节点的节点 ,图递增三层好友关系). 涉及到的Go语 ...
- 水管工游戏 (深搜)
水管工游戏 本题依然是采用搜索,深搜,广搜都可以,本代码采用深搜,此题在搜索时需要增加一些判断条件以及下一步要搜索的位置即可. 代码如下: #include<stdio.h> int a[ ...
- Poj(2488),按照字典序深搜
题目链接:http://poj.org/problem?id=2488 思路:按照一定的字典序深搜,当时我的想法是把所有的可行的路径都找出来,然后字典序排序. 后来,凡哥说可以在搜索路径的时候就按照字 ...
- [数据结构] 迷宫问题(栈和队列,深搜和广搜)
代码: #include <iostream> #include <string.h> #include <stack> #include <queue> ...
- 迷宫问题最短捷径c语言深搜,迷宫问题 C语言实现(深搜)
问题描述: 2015年05月21日 10:24:05 这是我自己出的一道题 其原型基于迷宫问题,用深搜来解决的!我就简单的说一说吧! 给定一个N * M 的迷宫!,1代表有障碍,0代表无障碍可通行 ...
- POJ-1724 深搜剪枝
这道题目如果数据很小的话.我们通过这个dfs就可以完成深搜: void dfs(int s) {if (s==N){minLen=min(minLen,totalLen);return ;}for ( ...
最新文章
- mysql存储过程语法及实例
- 科技部部长:基础研究是科技创新“总开关”
- 利用FreeNas创建WebDAV共享并实现ssl加密
- Data Partitioning Guidance
- python自动化测试看什么书-Python接口自动化测试
- Python常见问题(1):来历与简介General Python FAQ
- Linux16.04下配置Caffe,Pycaffe,matcaffe
- 2020恩智浦智能车大赛规则_2020年世界人工智能围棋大赛落幕,各路围棋AI共同论道...
- springBoot学习(二) 基础运行原理
- ajax怎么在html与php中使用,php – 如何在通过ajax加载的html中运行javascript
- Python3的编码问题
- 计算机的需求配置,软件最佳运行对计算机配置最低要求怎样?
- 新服务器如何安装操作系统,新服务器如何安装操作系统
- mysql排序后如何取最前和最后的数据_天天写order by,你知道Mysql底层如何执行吗?...
- 第七次全国人口普查公报[1](第六号) ——人口受教育情况
- nyoj 779 兰州烧饼
- FPGA复位电路设计学习分析
- 381个Android开源项目
- 最齐全的Cocos2D Cocos creator Cocos2Dx游戏源代码素材,速来收藏
- 全志D1-H芯片 如何在tina使用tplayerdemo 进行rtsp拉流说明?
热门文章
- 【转】Matlab中特殊符号的写法
- DB2中导出数据库的所有DDL脚本
- 【错误记录】GitHub 网站和仓库无法访问 ( 域名重定向 | 检查 C:\Windows\System32\drivers\etc\hosts 配置文件中的 GitHub 地址域名配置 )
- 【Git】Git 分支管理 ( 解决分支合并冲突 | 创建并切换分支 git switch -c feature1 | 修改 feature1 分支并提交 | 修改 master 主版本并提交 )
- 【运筹学】线性规划 单纯形法 案例二 ( 第一次迭代 | 矩阵变换 | 检验数计算 | 最优解判定 | 入基变量 | 出基变量 )
- 【UML 建模】UML建模语言入门 -- 静态图详解 类图 对象图 包图 静态图建模实战
- 巧妙使用网页在线工具,让您的工作更简单
- String 课后作业2
- javascript:void(0)与#区别
- android logger的使用