使用了队列(也许原理一样)
查看原帖
使用了队列(也许原理一样)
1450848
myxRUC楼主2025/1/21 18:03
#include<iostream>
#include<queue>
#include<string.h>
using namespace std;
struct word {
	char s[500] = {};
	int count[25] = {};
	int okk = 0;
};//储存每个接龙结果
word beg[25] = {};
queue < word > Q;//队列储存每个接龙结果
int check(char s1[], char s2[]) {//判断两个字符串能不能接龙
	int len = strlen(s1);
	int okk = 1;
	for (int i = len - 1; i >= 1; i--) {
		okk = i;
		for (int j = i; j < len ; j++) {
			if (s1[j] != s2[j - i]) {
				okk = 0;
				break;
			}
		}
		if (okk!=0) {
			return okk;//返回字符串重合点位置,便于接龙
		}
	}
	return 0;
}
int main(void) {
	int n = 0, maxl = 0;
	char dra_he='\0';
	cin >> n;
	for (int i = 0; i <n; i++) {//读取
		cin >> beg[i].s;
	}
	cin >> dra_he;//读取
	for (int i = 0; i < n; i++) {//锁定第一批能进行接龙的首单词
		if (beg[i].s[0] == dra_he) {
			beg[i].count[i]++;//记录每个单词出现次数
			Q.push(beg[i]);
		}
	}
	while (!Q.empty()) {
		int flag = 0;
		word tmp = Q.front();
		for (int i = 0; i < n; i++) {
			if (tmp.count[i] >= 2) {
				continue;//出现两次不能继续
			}
			else {
				if (check(tmp.s, beg[i].s) > 0) {//可以接龙就储存
					word tmp2 = tmp;
					for (int t=check(tmp2.s,beg[i].s),j=0;j<strlen(beg[i].s);j++,t++) {
						tmp2.s[t] = beg[i].s[j];
					}
					tmp2.count[i]++;//计数
					Q.push(tmp2);//加入队列
					flag = 1;//表明该段字符串还能利用
				}
			}
		}
		if (flag == 0) {
			maxl = maxl > strlen(tmp.s) ? maxl : strlen(tmp.s);//更新最大值
		}
		Q.pop();//清除队首
	}
	cout << maxl;//输出
	return 0;
}

对题目有一些思考,希望有帮助(也许本人方法麻烦难懂,希望佬不喷)

2025/1/21 18:03
加载中...