DFS训练-变形课~解题报告

变形课

题目描述:

呃…变形课上Harry碰到了一点小麻烦,因为他并不像Hermione那样能够记住所有的咒语而随意的将一个棒球变成刺猬什么的,但是他发现了变形咒语的一个统一规律:如果咒语是以a开头b结尾的一个单词,那么它的作用就恰好是使A物体变成B物体.
Harry已经将他所会的所有咒语都列成了一个表,他想让你帮忙计算一下他是否能完成老师的作业,将一个B(ball)变成一个M(Mouse),你知道,如果他自己不能完成的话,他就只好向Hermione请教,并且被迫听一大堆好好学习的道理.

Input:

测试数据有多组。每组有多行,每行一个单词,仅包括小写字母,是Harry所会的所有咒语.数字0表示一组输入结束.

Output:

如果Harry可以完成他的作业,就输出"Yes.",否则就输出"No."(不要忽略了句号)

Sampe Input:

在这里插入图片描述

Sample Output:

在这里插入图片描述

思路分析:

这道题相当于单词接龙一样,但是题目要求是从b字母开始的,所以我们必须要先找出b字母开头的,记录他们,然后要求字母结尾是m字母就可以满足条件。这道题没说要输入多少个,所以要用vector结构去写,但我不会写,难受,只能扩大数组。看能不能满足条件,居然过了还行。这道题也没说设置输入条件,所以必须要可以持续输出,这里就比较麻烦,╮(╯▽╰)╭。

AC代码:

用时:46ms


#include<cstdio>
#include<string.h>
char c1[10000][20];//记录单词 
int d[10000];//记录b开头单词所出现的序号 
int e[10000];//标记是否用过该单词 
int g=0;//记录有多少个单词 
int flag,flag1;//flag标记是否能够接龙成功,这个flag1也和flag差不多 
void LemonDFS(char c2)
{
	int i;
	if(flag)//这里是为了缩短运行时间,一旦达到要求了,后面就不用在继续DFS 
	{
		return;
	}
	for(i=0;i<g;i++)//分三种情况去看 
	{
		if(c1[i][strlen(c1[i])-1]=='m'&& c2=='m')//如果第一个找到m开头,就退出 
		{
			flag=1;
			return;
		}
		if(c2==c1[i][0] && c1[i][strlen(c1[i])-1]=='m' && e[i]!=1)//如果找到 m开头就退出 
		{
			flag=1;
			return;
		}
		if(c2==c1[i][0] && e[i]!=1)//如果接龙可以,并且没使用过该单词,就DFS下去 
		{
			e[i]=1;//标记用过该数字 
			LemonDFS(c1[i][strlen(c1[i])-1]);
			if(flag)//剪枝,缩短时间 
			return;
			e[i]=0;
		}
	}
}
int main()
{
	int b=0,c=0;
	while(scanf("%s",c1[g])!=EOF)//为了持续输入,这里就吐了 
	{ 
		flag=0;
		flag1=0;
		if(c1[g][0]=='0')
		{
			for(b=0;b<c;b++)//记录单词 
	{
		e[d[b]]=1;//记录 
		LemonDFS(c1[d[b]][strlen(c1[d[b]])-1]);//传b字母进去 
		if(flag)
		{
			printf("Yes.\n");
			flag1=1;
			break;
		}
		e[d[b]]=0;
	} 
	if(!flag1)
	printf("No.\n");
	memset(c1,0,sizeof(c1));
	memset(e,0,sizeof(g));
	memset(d,0,sizeof(d));
	g=0;
	continue;
		}
		if(c1[g][0]=='b')//记录b开头的单词 
		{
			d[c++]=g;
		}
		g++;
	}
}
发布了49 篇原创文章 · 获赞 6 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/xiaosuC/article/details/104247037