单词接龙

题目描述

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

输入输出格式

输入格式:

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

输出格式:

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

输入输出样例

输入样例#1:

5
at
touch
cheat
choose
tact
a

输出样例#1:

23

一:每个单词最多出现两次

二:不能包含

思路:dfs+函数strcat()的运用

#include
#include 
int n;
char ch;
int used[21];
char total[21][101];                       记录“龙”
char word[21][21];                         记录单词
int maxlen;
int ans;
int max(int a,int b)
{
	return a>b?a:b; 
} 
void search(int len)           
{
	int i; 
	if(len==1)
	{
		for(i=1;i<=n;i++)
		{
			if(word[i][0]==ch)
			{
				total[ans][0]='\0';       
				strcat(total[ans],word[i]);
				int l=strlen(total[ans]);
				maxlen=max(maxlen,l);
				used[i]++;
				search(l);
				used[i]--;
				ans++;                             只要与起始字母相同的都可以作为第一个单词
			} 
		}
	}
	else
	{
		for(i=1;i<=n;i++)
		{
			if(used[i]<2)                           因为最多使用两次
			{
				int j=len-1,k,f,leap;               从最后一个字母进行判断 是否与该单词的首字母相同
				int l=strlen(word[i]);
				while(j>0)
				{
					leap=1;
					for(k=j,f=0;k<len;k++,f++)
					{
						if(total[ans][k]!=word[i][f])
						{
							leap=0;
							break;
						}
					}
					if(leap==1)
						break;                     如果最后一个字母不相同 往前推一个
					j--;                           判断最后两个字母与该单词的首两个字母 以此类推
				}
				if(leap==1&&f!=l)                  判断是否能够对接的条件(前面说的两点)
				{
					total[ans][j]='\0';            j之后的字母便是相交,将j处位置设为结束点,再对接
					strcat(total[ans],word[i]);
					l+=j;
					maxlen=max(maxlen,l);
					used[i]++;
					search(l);
					used[i]--; 
				} 
			}
		}
	} 
} 
int main(void)
{
	int i;
	scanf("%d",&n);
	for(i=1;i<=n;i++) 
		scanf("%s",word[i]);
	scanf(" %c",&ch);                                PS:需要一个空格
	search(1);
	printf("%d",maxlen); 
}

你可能感兴趣的:(dfs)