刘汝佳《算法竞赛入门经典》的一道例题。
困难的串,没有连续的重复字符串 AA ABAB这种。。
输出第n个由前L个大写字母组成的字符串
和全排列有点像,一个字母一个字母往后面放,若满足条件,为困难的串,则继续递归。
#include<cstdio>
#include<cstring>
const int MAXN=100;
char a[MAXN];
int n,L,cnt;
bool dfs(int cur){
if(cnt++ == n){
for(int i=0;i<cur;i++){
if(i%64==0 && i) printf("\n"); //若16组后要先换行
else if(i%4==0 && i) printf(" "); //每4个用空格隔开
printf("%c",a[i]+'A');
}
printf("\n");
printf("%d\n",cur);
return false;
}
for(int i=0;i<L;i++){
a[cur]=i;
int ok=1;
for(int j=1;j*2<=cur+1;j++){
int equal=1;
for(int k=0;k<j;k++) //判断是否连续相同的字符串
if(a[cur-k]!=a[cur-k-j]) {equal=0;break;}
if(equal) {ok=0;break;}
}
if(ok) if(!dfs(cur+1)) return false;
}
return true;
}
int main(){
//freopen("in.txt","r",stdin);
while(~scanf("%d%d",&n,&L)){
if(n==0 && L==0) break;
memset(a,0,sizeof(a));
cnt=0;
dfs(0);
}
return 0;
}