分析:经典回溯,每当插入第i个字符(前i-1个符合要求)时对此串进行条件判断,若满足继续深搜,反之回溯,直至满足条件解。
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<string>
#include<map>
#include<cmath>
#include<sstream>
#include<queue>
#include<cctype>
using namespace std;
#define MAX 1001
typedef long long ll;
int cnt,L,n;
int ans[MAX];
int dfs(int cur) {
if(cnt++ == n) {
for(int i=0;i<cur;i++) {
if(i && i%64 == 0) printf("\n");
else if(i && i%4 == 0) printf(" ");
printf("%c",'A' + ans[i]);
}
printf("\n%d\n",cur);
return 0;
}
for(int i=0;i<L;i++) {
ans[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(ans[cur-k] != ans[cur-k-j]) {equal = 0;break;}
if(equal) {ok = 0;break;}
}
if(ok) if(!dfs(cur+1)) return 0;
}
return 1;
}
int main() {
while(~scanf("%d%d",&n,&L) && (L || n)) {
cnt = 0;
dfs(0);
}
return 0;
}