使用深度优先搜索解决,很简单的题。
建立26个字母的邻接矩阵图和访问数组,从字母b开始搜索,若能到达字母m则可以变形。
#include<iostream>   
using namespace std;
int v[27];
int m[27][27];
bool dfs(int x)
{
	if(x=='m'-'a')      //搜到字母m结束
		return true;
	for(int i=0;i<26;i++)
	{
		if(m[x][i]==1 && !v[i])
		{
			v[i]=1;
			if(dfs(i)) return true;     //搜到(到达)就结束
			v[i]=0;
		}
	}
	return false;
}
  
int main()  
{ 
	char a[101];
	while(scanf("%s",a)==1 && a[0]!='0')
	{
		m[a[0]-'a'][a[strlen(a)-1]-'a']=1;
		while(scanf("%s",a)==1 && a[0]!='0')
			m[a[0]-'a'][a[strlen(a)-1]-'a']=1;
		if(dfs('b'-'a'))             //从字母b开始搜索
			cout<<"Yes."<<endl;
		else 
			cout<<"No."<<endl;
	}
    return 0;  
}
原文地址:http://blog.csdn.net/a809146548/article/details/44262387