一个回溯的基本题目,简单易理解
// UVA 129
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
const int maxn=500;
int n,l;
int s[maxn];
int cnt;
void print(int cur){
for(int i=0; i<cur; i++){
if(i%64==0 && i!=0) cout<<endl;
else if(i%4 == 0 &&i!=0) cout<<" ";
cout<<(char)('A'+s[i]);
}
}
int dfs(int cur){
if(++cnt == n){
print(cur);
cout<<endl;
cout<<(cur)<<endl;
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 cp = 1;//copy
for(int k = 0; k < j &&cur-k>cur-j; k++)
if(s[cur-k] != s[cur-k-j]) { cp=0; break;}
if(cp) {ok=0; break;}
}
if(ok) if(!dfs(cur+1)) return 0;
}
return 1;
}
int main(){
while(cin>>n>>l,n){
cnt=-1;
s[0]=0;
dfs(0);
}
return 0;
}