我实在是想不到怎么写比较好,我决定敲个暴力看一看,没想到就过了。而判断加入一个字母后是否会导致和前面的重复直接暴力看就好了,最多是80个字符,那么暴力的次数为40 + 39 + …… + 1 = 820,也不多。。。然后就是不断递归的过程了。
代码如下:
#include<bits/stdc++.h>
using namespace std;
int n, l;
int a[10005];
bool Check(int x)
{
if(x == 1)
return 1;
bool flag;
for(int i = 1; i <= x / 2; i++)
{
flag = 1;
for(int j = x - 2 * i; j < x - i; j++)
if(a[j] != a[j + i])
flag = 0;
if(flag)
return 0;
}
return 1;
}
void dfs(int x)
{
if(n == 0)
{
for(int i = 0; i < x; i += 4)
{
if(i != 0 && i % (4 * 16) == 0)
puts("");
else if(i)
cout << " ";
for(int j = 0; j < 4 && i + j < x; j++)
putchar('A' + a[i + j]);
}
cout << endl;
cout << x << endl;
}
for(int i = 0; i < l && n; i++)
{
a[x] = i;
if(Check(x + 1))
{
n--;
dfs(x + 1);
}
}
}
int main()
{
while(cin >> n >> l, n + l)
{
memset(a, -1, sizeof(a));
dfs(0);
}
return 0;
}