简单深搜:先判定一下有没有m结尾的单词,然后再dfs,注意记录一下已经被挑选过的单词。
代码如下:
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int n, use[1111];
char str[1111][1111];
int key;
void dfs(int a) {
int len;
len = strlen(str[a]);
if (str[a][len - 1] == 'm') { //如果这个单词本身就是以m结尾
key = 1;
return;
}
for (int i = 0; i < n; i++) { //从第一个单词开始寻找
if (str[i][0] == str[a][len - 1] && use[i] == 0) { //如果第i个单词的开头与第a个单词的结尾相等,且没有找过
use[i] = 1; //标记为已找过
dfs(i);
use[i] = 0; //关键点,如果从第i个单词搜一遍不符合,则要将其标为没走过
}
}
}
int main() {
while (scanf("%s", str[0]) != EOF) {
memset(use, 0, sizeof(use));
int i, flag = 0;
n = 1, key = 0;
while (1) { //循环输入单词,直到遇到0位置
scanf("%s", str[n]);
int len;
len = strlen(str[n]);
if (str[n][len - 1] == 'm') //如果存在以m结尾的单词,进行标记
flag = 1;
if (str[n][0] == '0')
break;
n++;
}
if (!flag) //如果不存在以m结尾的单词,直接输出No.
printf("No.\n");
else
{ //如果存在以m结尾的单词
for (int i = 0; i < n; i++)
{ //从第一个单词开始搜索以b开头的单词
if (str[i][0] == 'b')
dfs(i);
}
if (key) //如果可以找到收尾相连的单词组合
printf("Yes.\n");
else
printf("No.\n");
}
}
system("pause");
return 0;
}