紫书195页,
#include"algorithm"
#include"cstring"
#include"cstdio"
using namespace std;
int n,L,cur=0,cnt=0;
int S[10000];
int dfs(int cur)
{
if(cnt++ == n)//cnt表示是第几个进来的困难串了。
{
for(int i = 0;i < cur;i ++)
{
if(i%4==0&&i!=64&&i!=0)
{
printf(" ");
}
if(i == 64)
{
printf("\n");
}
printf("%c",'A' + S[i]);
}
printf("\n");
printf("%d\n",cur);
return 0;
}
for(int i = 0;i < L;i ++)//每个位置放A~A+L的字母去看能否是困难串,是的话就递归。
{
S[cur]=i;
int ok=1;
for(int j = 1;j <=(cur +1)/2;j++)//j==1时会判断相邻字符是否相等,j==2时判断两个两个挨着的是否相同字串,以此。
{
int equal = 1;
for(int k = 0;k < j;k ++)
{
if(S[cur-k] != S[cur-k-j])//结合j实现前一部分和后一部分的判断
{
equal = 0;
break;
}
}
if(equal)
{
ok = 0;
break;
}
}
if(ok)
{
if(!dfs(cur+1))//满足困难字串的条件就往下递归,此时的S[cur]存的是满足的那个字符。
{
return 0;//只要有一次return 0了,一下全都会结束递归。
}
}
}
return 1;
}
int main()
{
while(scanf("%d %d",&n,&L))
{
if(!n && ! L)
{
break;
}
memset(S,0,sizeof(S));
cnt=0;
dfs(0);
}
}