全部wa,急急急!!!
查看原帖
全部wa,急急急!!!
866969
telankesi楼主2022/12/28 19:16
#include <stdio.h>
#include <string.h>
char w[23][20];
int n;
int f[23];//用于标记用了几次
char last[300];
int num = 1;
int max = 0;
void fun(char L[300]) {
	int flag = 0,len=0;
	for (int i = 1; i <= n; i++) {
		for (int j = strlen(L) - 1; j > 0; j--) {  //倒着查找与W[i][0]相同的字母;
			if (L[j] == w[i][0]) {        
				len = strlen(L) - 1 - j;       //找到之后记录与L最后一个字母的距离
			}
		}
		if (len) {   //如果找到了检查这段长度的字母是否重合
			for (int j = strlen(L) - 1 - len; j<strlen(L); j++) {  
				if (L[j] != w[i][j-strlen(L)+1+len])
					len = 0; //不重合len=0
			}

		}
		if (len!=0&&f[i]<2) {  //如果找到且可以使用
			num += strlen(w[i]) - len;  //长度增加
			f[i]++;     //次数加一
			char p[300];
			strcpy(p, L);   //记录原来的L
			strcat(p, w[i] + len);
			fun(p);   //进去拼接后的p
			num = num - strlen(w[i]) + len;//回溯
			f[i]--;       
			num =num- strlen(w[i]) + 1;
			flag = 1;
		}
	}
	if (flag == 0) {   //如果没有拼接,判断是否是优解
		if (num > max) { max = num; }
	}

}

int main(){
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) {
		scanf("%s", w[i]);
	}

	scanf(" %c", &last[0]);
	
	fun(last);
	printf("%d", max);
	return 0;

}
2022/12/28 19:16
加载中...