//dfs回溯
//得到第n小的由前l个字母组成的困难串(不包含两个连续的重复子串)
#include <iostream>
#include<cstdio>
using namespace std;
const int maxn=1e6+5;
int n,l,cnt;
int s[maxn];
bool dfs(int cur) //cur为填入位置
{
if(cnt==n) {
int k=0;
for(int i=0;i<cur;i++)
{
if(i&&i%4==0) {
k++;
if(k%16==0) printf("\n");
else printf(" ");
}
printf("%c",s[i]+'A');
}
printf("\n%d\n",cur);
return false;
}
else {
for(int i=0;i<l;i++)
{
s[cur]=i; //尝试填入
bool flag=true;
//判断是否有连续子串
for(int j=1;j<=(cur+1)/2;j++) //枚举可能比较长度
{
bool ok=false;
for(int k=0;k<j;k++)
{
if(s[cur-k]!=s[cur-k-j]) {
ok=true;
break;
}
}
if(!ok) {
flag=false;
break;
}
}
if(flag) {
cnt++;
if(!dfs(cur+1)) return false; //退出递归搜索
}
}
return true;
}
}
int main()
{
while(scanf("%d%d",&n,&l)==2)
{
if(!n&&!l) break;
cnt=0;
dfs(0);
}
return 0;
}
uva 129 Krypton Factor dfs枚举
最新推荐文章于 2024-08-14 11:57:07 发布