回溯法的再次利用,体会精妙之处。 多研究,多做题~~
#include<bits/stdc++.h>
using namespace std;
int n,L,cnt,s[100];
int dfs(int cur) {
if(cnt++==n) {
int kase=0,ans=0,ens=0;
for(int i=0;i<cur;i++){
printf("%c",'A'+s[i]); kase++; ens++;
if(kase==4) { kase=0; ans++; }
if(ans!=16&&kase==0&&i!=cur-1) printf(" ");
if(ans==16) { printf("\n"); ans=0; }
}
if(ans==0&&kase==0) ; else printf("\n");
printf("%d\n",ens);
return 0;
}
for(int i=0;i<L;i++) {
s[cur]=i;
int ok=1;
for(int j=1;j*2<=cur+1;j++){
int equ=1;
for(int k=0;k<j;k++)
if(s[cur-k]!=s[cur-k-j]) { equ= 0; break; }
if(equ) { ok=0; break; }
}
if(ok) if(!dfs(cur+1)) return 0;
}
return 1;
}
int main() {
while(scanf("%d%d",&n,&L)!=EOF) {
if(n==0&&L==0) return 0;
memset(s,0,sizeof(s));
cnt=0;
dfs(0);
}
return 0;
}