Acwing_1117单词接龙【DFS之搜索顺序】

题目描述:
在这里插入图片描述

输入样例:
5
at
touch
cheat
choose
tact
a

输出样例:
23

AC代码:

#include<string>
#include<iostream>
#include<algorithm>


using namespace std;
const int N = 21;

int n;
string word[N];//存放单词
int g[N][N];//记录每两个单词之间是否有边
int used[N];//记录每个单词被使用的次数
int ans;//存放答案
//str存放的是成语接龙
void dfs(string str, int last) {
	ans = max(ans, (int)str.size());
	used[last]++;
	for (int i = 0; i < n; i++) {
		if (g[last][i] && used[i] < 2) {
			dfs(str + word[i].substr(g[last][i]), i);
		}
	}
	used[last]--;
}


int main()
{
	cin >> n;
	for (int i = 0; i < n; i++) cin >> word[i];
	char start;
	cin >> start;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			string a = word[i], b = word[j];
			for (int k = 1; k <min(a.size(),b.size()); k++) {
				if (a.substr(a.size() - k, k) == b.substr(0, k)) {
					g[i][j] = k;
					break;
				}
			}
		}
	}
	for (int i = 0; i < n; i++) {
		if (word[i][0] == start)
			dfs(word[i], i);
	}
	cout << ans << endl;


	system("pause");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值