题意:用前l个大写的字母构成没有相邻子串的字符串,这种串称作困难串,求出前n个困难串,并按格式输出
#include<cstdio>
using namespace std;
int n,l,cnt;
char a[100];
bool dfs(int cur)
{
if(cnt++==n)
{
for(int i=0;i<cur;i++)
{
if(i%64==0&&i)printf("\n");
else if(i%4==0&&i)printf(" ");
printf("%c",a[i]+'A');
}
printf("\n");
printf("%d\n",cur);
return true;
}
for(int i=0;i<l;i++)
{
a[cur]=i;//试探i
int ok=1;
for(int j=1;j*2<=cur+1;j++)
{
int equal=1;
for(int k=0;k<j;k++)//检查长度为j的子串是否相等 a[cur-2*j+1~ cur-j] a[cur-j+1 ~ cur]
{
if(a[cur-k]!=a[cur-j-k]) //cur-2*j+1>=0 2*j<=cur+1
{
equal=0;break;
}
}
if(equal)
{
ok=0;
break;//有相同相邻子串,不符,不能继续递归,继续试探
}
}
if(ok)
{
if(dfs(cur+1))return true;
}
}
return false;
}
int main()
{
while(scanf("%d%d",&n,&l)&&(n+l))
{
cnt=0;
dfs(0);
}
}
本文介绍了一种使用前l个大写英文字母生成困难字符串的算法。困难字符串是指不包含任何相邻重复子串的字符串。文章详细展示了如何通过深度优先搜索(DFS)策略递归地构造这些字符串,并遵循特定格式进行输出。
499

被折叠的 条评论
为什么被折叠?



