单词接龙(C语言)

您所在的位置:网站首页 吉祥航空有限责任公司官网 单词接龙(C语言)

单词接龙(C语言)

2023-09-13 18:36| 来源: 网络整理| 查看: 265

题目

题目背景

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

题目描述

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

输入格式

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

输出格式

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

输入输出样例

输入 #1复制

5 at touch cheat choose tact a

输出 #1复制

23 说明/提示

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

n≤20

题解

 1.一个单词最多可以用两次,标记函数在走过这个坐标的时候加1,判断一下标记单词数组是否小于等于1。

2.用一个函数求出最短重合的数据长度,且这个长度不能等于两个字符中的最短字符长度。贪心思想,在重和长度最小的时候,龙的长度才可能长。

3.关于输入,建议最好把最后那个单个字符放入字符串二维数组中,不然结果可能会不同。

4.取最大值要设置一个记录数据的全局变量。

5.如果没有找到与特定字符开头的字符串,最后龙的长度是1。

代码如下

#include"stdio.h" #include"string.h" int n,book[21]={0}; char x[21][1000],t; long long int len1=1; int min(int a,int b) { if(a>b) return b; return a; } int max(int a,int b) { if(a>b) return a; return b; } int cd(char s1[],char s2[])//求出字符最少重复的部分 { int i,m,j,sign; int l=min(strlen(s1),strlen(s2)); for(i=1;i=1;j--) { if(s1[strlen(s1)-j]!=s2[i-j]) sign=1; } if(sign==0) { return i; break; } } return 0; } void dfs(char s1[],int len) { int i,j; len1=max(len,len1); for(i=0;i=2) continue;//一个单词最多用两次 j=cd(s1,x[i]); if(j==0) continue; if(j>0) { book[i]++; dfs(x[i],len+strlen(x[i])-j); book[i]--; } } } int main() { int m,z=0; scanf("%d",&n); getchar(); for(m=0;m


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3