单词接龙

## 题目背景

注意:本题为上古 NOIP 原题,不保证存在靠谱的做法能通过该数据范围下的所有数据。

## 题目描述

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

## 输入格式

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

## 输出格式

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

## 样例 #1

### 样例输入 #1

```
5
at
touch
cheat
choose
tact
a
```

### 样例输出 #1

```
23
```

## 提示

样例解释:连成的“龙”为 `atoucheatactactouchoose`。

$n \le 20$。

易错点1: 需要找到重合部位,刚开始我还以为是abcd,和dcaa这样可以接龙的话是俩个字符,在样例通过的情况下我,寻找了很久才发现原来abcd和cdaa接龙才是俩个字符。(读题不仔细的后果)

易错点2:字符串输入的过程不需要加getchar();龙头字符的输入的时候我们使用%s读入,即便是%c,别问,问就是WA了很多发(具体详情参考代码)

思路:在借鉴daolao们的博客后,终于对这题有了眉目,是这样的:首先在输入的时候对其预处理,利用二维数组,把俩俩字符串之间的重合部位的字符个数存起来,下标记录哪俩个字符串,元素存储他们俩的重合部分的字符个数,就形成了dfs喜闻乐见的地图,我们对其进行搜索,即可得到最大值。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
char ch[25][100000];//这里忘记说了,数组尽可能的开大一点。因为我们不知道字符串的长度
int book[25],n;//book为记录用过几次
int re[21][25];//存储俩俩单词的字符重合个数
int ans=0;
int min(int n1,int n2)//返回小值
{return n1>n2?n2:n1;
}
int max(int n1,int n2)//返回大值
{return n1>n2?n1:n2;
}
int check(int n1,int n2)//计算单词的重合部分的字符个数
{ //此处就是前言思路中提到的易错点1(仔细审题!!!)int len1=strlen(ch[n1]),len2=strlen(ch[n2]);//得到2个字符的长度int len=min(len1,len2)-1;//选取其中小的那个int flag;for(int i=1;i<=len;i++)//注意这里我们从1开始遍历,防止了包含的情况比如at 和atthere,会被避免开来{flag=1;//每次进循环的flag都为1for(int j=0;j<i;j++){if(ch[n1][len1-i+j]!=ch[n2][j])//推荐在纸上模拟此过程!!!{flag=0;//如果有不相等的字符flag=0;且跳出循环,此时j的值不会被改变,随后i++,随后进入j的循环//此时j的范围变大了(但不会超过小的那个字符的长度),通过i,j的变换来比较字符串1和字符串重复个数break;}}if(flag!=0)return i;//返回俩个单词最小的重合部分}return 0;    //无重合部分
}
void dfs(int sum,int pre)
{ans=max(ans,sum);//保证ans为字符串长度的最大值for(int i=0;i<n;i++)//搜索n个字符串{int temp=re[pre][i];//得到pre字符串和i字符串的重合字符个数if(temp!=0&&book[i]<2)//存在重合部分且没有被使用过俩次{ book[i]++;//使用次数+1dfs(sum+strlen(ch[i])-temp,i);book[i]--;//回溯}}
}
int main()
{char head;scanf("%d",&n);for(int i=0;i<n;i++){scanf("%s",ch[i]);}getchar();//这里是需要加getchar()读取掉多余的换行符scanf("%s",&head);//龙头(易错点2)/*预处理(这里就是前言思路中提到的借鉴了dalao的思路的预处理)实在是妙,蒻蒻苦思冥想好久好久都不知道怎么处理,这里的思路就是利用一个整形二维数组存下俩俩字符串之间的重合的字符个数(蒻蒻之前也有这样想过,但是不知道该怎么存储)这里是利用了二维数组的下标表示哪俩个字符串的重合部分,利用俩发for可以得到俩俩字符串之间的所有重合可能*/for(int i=0;i<n;i++){for(int j=0;j<n;j++){re[i][j]=check(i,j);//二维数组存下所有俩俩字符之间的重合的字符个数}}   //遍历字符串数组,从开头为龙头的部位开始搜索for(int i=0;i<n;i++){if(ch[i][0]==head)//找到开头为龙头的字符串为起点开始搜索{book[i]++;//不要忘记此处的book[i]++;假如没有这个的话,龙头字符串会被使用3次(因为在这里,龙头字符数组是被使用过了的)dfs(strlen(ch[i]),i);}}printf("%d",ans);
}

因为今天可算把题组刷完了,腾出时间学了会儿图形库的知识

卡通熊的绘制

#include<stdio.h>
#include<easyx.h>
int main07()
{initgraph(800, 600);//画布800*600setbkcolor(RGB(169, 92, 10));//设置背景色cleardevice();//设置背景色一定不要忘记这句话了//耳朵setfillcolor(RGB(130, 69, 4));//设置耳朵阴影的颜色solidcircle(200, 130, 90);solidcircle(600, 130, 90);setfillcolor(RGB(255,178,50));//耳朵的颜色solidcircle(200, 120, 90);//坐标比阴影坐标稍微向上,从而实现阴影的效果solidcircle(600, 120, 90);//设置区域HRGN left = CreateEllipticRgn(110, 30, 290, 210);//左耳朵HRGN right = CreateEllipticRgn(510, 30, 690, 210);//右耳朵HRGN temp = CreateRectRgn(0, 0, 0, 0);//使用区域组合函数CombineRgn的时候我们要记得设置一个空的目标区域CombineRgn(temp, right, left, RGN_OR);//调用区域组合函数//左耳和右耳取并集作为剪切区域setcliprgn(temp);//也要记得创建剪切区域,前面只是设置了区域,并不是剪切区域setfillcolor(RGB(243, 154, 2));//耳朵高光的绘制solidcircle(200, 130, 90);solidcircle(600, 130, 90);//耳朵内部阴影的绘制setfillcolor(RGB(255, 178, 50));solidcircle(200, 210, 90);solidcircle(600, 210, 90);DeleteObject(left);//删除设置的区域DeleteObject(right);//删除设置的区域setcliprgn(NULL);// 剪切区域设置为NULLsetfillcolor(RGB(255,178,50));solidcircle(400, 300, 250);HRGN head = CreateEllipticRgn(150, 50, 650, 550);//设置圆形区域setcliprgn(head);//创建剪切区域//在剪切的区域中绘制图形造出高光效果setfillcolor(RGB(243, 154, 2));solidcircle(400, 320, 250);DeleteObject(head);//销毁创建的区域setcliprgn(NULL);//剪切区域设置为NULL(防止接下来绘制的图形被剪切)//使用剪切区域的时候一定不要忘记了。//眼睛setfillcolor(RGB(51, 34, 8));solidcircle(275, 300, 25);solidcircle(525, 300, 25);//嘴巴的设置setfillcolor(RGB(130,69,4));//先设置嘴巴下面的阴影solidellipse(310, 385, 490, 485);//白色嘴巴的设置setfillcolor(WHITE);solidellipse(310, 380, 490, 480);//相较与阴影图形坐标上移即可//鼻子setfillcolor(BLACK);//鼻子颜色的设置solidcircle(400, 420, 15);//胡须setlinecolor(BLACK);//胡须的颜色设置setlinestyle(PS_SOLID, 5);//胡须形式的设置(实线,5像素粗细)line(370, 450, 400, 420);line(430, 450, 400, 420);getchar();closegraph();return 0;
}

图形的运动(向右运动,往返运动,以矩形的方式运动,圆周运动,圆周运动加自转运动)

#include<stdio.h>
#include<easyx.h>
#include<math.h>
#define PI 3.14
void star(int x,int y,int r,double Aangle)//绘制五角星的函数
{double data = 2 * PI / 5;POINT points[5] = {0};for (int i = 0; i < 5; i++)//利用循环找到五个顶点{points[i].x = cos(Aangle + i * data * 2) * r + x;points[i].y = sin(Aangle + i * data * 2) * r + y;}solidpolygon(points, 5);//绘制填充五角星
}
int main()
{initgraph(800, 600);//画布的绘制setorigin(400, 300);//设置逻辑坐标系的原点为400,300setaspectratio(1, -1);   //改变逻辑坐标系的y轴方向setbkcolor(RGB(164, 225, 202));//设置背景色cleardevice();//用背景色清空窗口//圆的移动//setfillcolor(WHITE);//solidcircle(-400, 0,50 );//for (int x = -400; x <= 400; x += 5)//圆心横坐标每40ms+5像素//{//  cleardevice(); //用背景色清空窗口// solidcircle(x,0, 50);// Sleep(40);//休眠函数(让圆40ms移动5像素)//}//五角星的移动setfillcolor(WHITE);setpolyfillmode(WINDING);//向右运动//int y = 0;//for (int x = -400; x <= 400; x += 5)//圆心横坐标每40ms+5像素//{//   cleardevice(); //用背景色清空窗口// star(x, y, 50, PI / 2);//   Sleep(40);//休眠函数(让圆40ms移动5像素)//}//左右往返运动//int dx = 5, x = -400,y=0;//while(1)//圆心横坐标每40ms+5像素//{//    cleardevice(); //用背景色清空窗口// x += dx;//    star(x, y, 50, PI / 2);//   if (x == 400 || x == -400)//设置边界,到达边界后对dx取相反数从而达到往返运动//  {//     dx = -dx;//    }// Sleep(40);//休眠函数(让圆40ms移动5像素)//}//以矩形的形式往返运动//int x=-300, y=200, dx = 5, dy = 0;//while (1)//{//  if (x == -300 && y == 200)//通过设置四个顶点,改变其dx,dy的值从而改变图形的运动方向//  {//     dx = 5, dy = 0;// }// else if (x == 300 && y == 200)//    {//     dx = 0, dy =  -5;//   }// else if (x == 300 && y == -200)//   {//     dx = -5, dy = 0;//    }// else if (x == -300 && y == -200)//  {//     dx = 0, dy = 5;// }// cleardevice();//    star(x, y, 50, PI / 2);//   Sleep(40);//    x += dx;//    y += dy;//}//圆周运动//int x, y, r = 200;//double theta = 0, dtheta = 0.05;//while (1)//{//通过改变x,y的值对图形进行移动//  x = cos(theta) * r;//利用三角函数改变其数值,呈现出圆周运动的形式//   y = sin(theta) * r;//  cleardevice();//    star(x, y, 50, PI / 2);//   Sleep(40);//休眠40ms//    theta += dtheta;//圆周角每次变化0,05;//}//圆周运动的同时自转//int x, y, r = 200;//double theta = 0, dtheta = 0.05;//double angle = PI / 2,dangle=0.05;//在自转的基础上改变初始角的度数,即产生旋转的效果//while (1)//{//    x = cos(theta) * r;//  y = sin(theta) * r;//  cleardevice();//    star(x, y, 50, angle);//    Sleep(40);//    theta += dtheta;//    angle += dangle;//}getchar();closegraph();return 0;
}

12月30日学习总结相关推荐

  1. 个人空间岁末大回报活动12月30日获奖名单

    个人空间岁末大回报: 动手就有C币拿!活动已于15日启动,非常感谢各位网友的大力支持和积极参与,个人空间的所有工作人员在这祝大家好运,希望你们每天都能拿到C币存入社区银行! 欢迎各位获奖者去自己的银行 ...

  2. 互联网晚报 | 12月30日 星期四 | 百度网盘青春版正式上线;汽车之家回应“年底大裁员”;A股年内成交额创历史新高...

    ‍ 今日看点 ✦ 腾讯微信支付支持全量商家小程序场景开通银联云闪付功能 ✦ 百度网盘青春版正式上线:免费空间10GB,支持无差别速率下载 ✦ 汽车之家:不存在大规模裁员,整体人员优化幅度不及5% ✦ ...

  3. 12月30日热烈欢迎软通动力参观武汉众嵌科技

    软通动力信息技术(集团)有限公司(iSoftStone)是中国领先的IT外包服务提供商,总部设在北京,在美国.日本.韩国及中国本土的上海.大连.武汉.深圳.天津.无锡.广州.南京等地设有分支机构.至2 ...

  4. 2008铁路旅客列车时刻表_重要消息!唐山站100多列旅客列车调整,12月30日起开始实行...

    自2019年12月30日零时起,唐山站旅客列车调整图实行.此次调图,唐山站合计调整列车102列,其中高速场38列.普速场64列.调图后唐山本站合计办理客运业务列车219列,普速场127列(较调图前减少 ...

  5. 【历史上的今天】12 月 30 日:C++ 之父诞生;Hotmail 创始人出生;Facebook 注册破百万

    整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来. 今天是 2021 年 12 月 30 日,在 1930 年的这一天,"青蒿素之母"屠呦呦出生.2015 ...

  6. 12月30日goCom社区OSGi Topic大纲和PPT

    12月30日下午13:00--15:00我将在普元goCom社区举行一次OSGi Topic,欢迎感兴趣的O粉(OSGi Fans)到时前往交流和讨论,由于这是在网上首次进行的公开Topic,鉴于对听 ...

  7. 鸿图之下服务器维护10月25,更新公告丨《鸿图之下》12月30日维护更新预告

    为了帮助大家更好地体验游戏,我们收集了大家的意见,并计划进行一次维护.此次维护将从12月30日凌晨5点00分开始,预计维护2小时.请各位主公提前安排游戏时间,稍作休息. 平衡性调整 调整张辽自带武技[ ...

  8. 紫禁繁花服务器维护一般多久,紫禁繁花手游2020年12月30日更新公告

    国力庆典活动即将开启!上线即可领取新服饰哦!那么本次版本更新了哪些有趣的内容呢?下面就让我们一起来看一下吧~! 紫禁繁花手游2020年12月30日更新公告 国力庆典活动 参与[国力庆典]活动 有机会获 ...

  9. 2013年12月30日 星期一 谷歌、百度地图拽取

    2013年12月30日 星期一 17:12:33 晴 by Again 2013-12-30 17.12.38 先说名几句题外话: 第一,由于需要我也是半路出家,所以多专业就谈不上了.说白了js和用到 ...

最新文章

  1. jquery 插件
  2. oracle如何降低逻辑读,如何降低该SQL的逻辑读
  3. python_面向对象
  4. 数据工程师妹子养成手记——数据库篇
  5. MySQL存储过程中的3种循环
  6. Swift数据类型_整型和浮点型
  7. java计算两个时间段的重合天数
  8. sublime text 3 输入中文 linux,解决 Linux 下 Sublime Text 3 中文无法输入问题
  9. 数据之路 - 数据可视化 - PowerBI工具
  10. hmcl手机版_hmcl启动器手机版软件下载-我的世界hmcl启动器官网版最新下载v3.3.159-飘荡下载...
  11. WPS ppt添加幻灯片编号无反应
  12. 培训机构常见sql查询练习题目,你会做吗?
  13. mysql声明变量关键字_声明变量的关键字
  14. Caffe2自定义Operator
  15. ReadFile 函数
  16. Macromedia Captivate
  17. Unity 3D游戏七:打靶游戏
  18. 综合工时制-跨零点到节假日的工时统计异常问题的思考
  19. centos7修改root用户密码
  20. 语音备忘录如何转换成文字 支持录音并转文字的便签备忘录

热门文章

  1. python实现键盘记录木马
  2. zepto - 实现滑动翻页
  3. An internal error occurred during: Add Deployment.
  4. 任天堂游戏服务器系统,传闻:任天堂正在替换用了18年的多人服务器系统
  5. Spring Security Web : FirewalledResponse 经过防火墙加强安全的响应
  6. 第2章 感知机 - 对偶形式
  7. Telnet 控制智能灯泡
  8. originPro导出图像的关键设置
  9. Android clippling使用
  10. Ear Clipping算法简介