博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NOIP 2000年提高组复赛 单词接龙
阅读量:6995 次
发布时间:2019-06-27

本文共 1366 字,大约阅读时间需要 4 分钟。

(╥╯^╰╥)说起这道题就心酸,几个数据特别坑,几分钟写完的程序花了一个上午调试bug,吐槽完毕,进入正题:

1,需要建立一个标记数组vis表示当前单词被采取的次数;

2,for循环中找到每一个符合条件的龙头,初始化标记数组后进行深度优先搜索;

3,因为连接起来的单词要最长,所以对比是选择从上一个单词的末尾与当前单词的开头进行比对,一旦符合就return

注意!字符相等还不一定符合题意,一定要比到上一个单词的最后一个字符才算符合条件,给出两组数据自己揣摩:

(自己思考后才能有收获吗(~ ̄▽ ̄)~ )

1                                       2

envelope                           abababab

e                                       abababc

ans:15                            a                    ans:19

下面在代码中进行分析:

#include
#include
#include
using namespace std;struct node{ char lin[1000];}s[20]; // 结构体 s 用于储存单词 int t,ans;int vis[20]; //标记数组,每一次搜索初始化为 0,单词使用一次加一,超过二就不能继续使用 int len[20]; //单词长度数组,表示每一个单词的长度 int found(int stp,int i){ //stp代表上一个已经选择的单词下标 i表示当前的单词下标 int q,w,j; for(q=len[stp]-1;q>=1;q--){ //为使长度最长,从上一个单词的末尾开始搜索 if(s[stp].lin[q]==s[i].lin[0]){ //第一个字符匹配后继续看后面还有多少位 int x=0; //相同位数 for(w=q,j=0;w
=2)continue;//单词已经被找过两次,跳过 int x=found(stp,i); //x代表上一个单词与当前单词的匹配位数 if(x!=0){ //匹配位数不为0就继续进行下一次的单词搜索 mark=true; length+=(len[i]-x); //当前长度增加 vis[i]+=1; //当期单词用过一个加一 dfs(i,length); //上一步递归不符合题意返回至此,长度减去不符合题意的单词,单词的使用次数减一,继续选择单词 length-=(len[i]-x); vis[i]-=1; } } if(mark==false){ //如果已经找不到单词,比较之前已经得到过的答案选择最长的单词数 ans=max(ans,length); }}int main(){ int i; char l1; cin>>t; for(i=0;i
>s[i].lin; len[i]=strlen(s[i].lin); } cin>>l1; ans=0; for(i=0;i

转载于:https://www.cnblogs.com/zhizhaozhuo/p/9594246.html

你可能感兴趣的文章
C语言的指针、数据、结构体关系总结
查看>>
MyBatis的association示例——MyBatis学习笔记之三
查看>>
Zabbix如何监控Windows机器
查看>>
细谈那年初做自媒体经验分享
查看>>
T4高等级数据中心有章可循
查看>>
Unix学习之 APUE学习笔记 之 系统限制,errno,时间观念
查看>>
Prolog中文教程 - List[列表]
查看>>
美俄激辩“网络战争” 应对网络攻击分歧重重
查看>>
PlaneProjection 类 表示对象的透视转换(类似三维效果)[silverlight]
查看>>
《The Elements of User Experience》读书笔记
查看>>
linux条件锁和互斥锁
查看>>
iphone 开发环境,先根据硬件安装虚拟机或mac
查看>>
屏蔽右键代码(防止网页恶意复制)
查看>>
每天自动发英文外链 247backlinks
查看>>
[收藏]书籍推荐
查看>>
ipad 、iphone开发-通过定时器显示进度条
查看>>
综合知识总结
查看>>
【技术贴】PL/SQL错误提示 database character set(AL32UTF8) a
查看>>
Oracle学习<四>
查看>>
英语字根
查看>>