思路:就是检查每一个位置应该填什么,并且填完要保证是不能有相邻的自子串,只需要从后向前枚举长度i = 2.....(当前字符串长度 + 1) / 2,然后判断一下就行,具体看代码,有点乱。。
代码:
#include <cstdio>
#include <cstring>
int n,l;
char ans[100];
int flag;
int cnt ;
FILE *fw;
bool check(char c ,int cur)
{
for(int i = 2;i * 2 <= cur + 1;++i)
{
int ok = 1;
if(c != ans[cur - i])
continue;
for(int j = cur - 1,k = cur - i - 1; j > cur - i ;--j,--k)
if(ans[j] != ans[k]){
ok = 0;
break;
}
if(ok)
return false;
}
return true;
}
void dfs(int s)
{
if(cnt == n)
{
ans[s] = '\0';
int len = strlen(ans);
int f = 1;
for(int i = 0;i < len;++i)
{
if(i == 64)
printf("\n");
if(i % 4 == 0 && i && i != 64)
printf(" ");
printf("%c",ans[i]);
}
// fprintf(fw,"\n%d\n",len);
printf("\n%d\n",len);
flag = 1;
return ;
}
if(flag)
return ;
for(int i = 0;i < l;++i)
{
if(s == 0)
{
ans[s] = i + 'A';
cnt++;
dfs(s + 1);
}
else if(ans[s - 1] != i + 'A' && check(i + 'A',s))
{
ans[s] = i + 'A';
cnt++;
dfs(s + 1);
}
}
}
int main()
{
fw = fopen("output.txt","w");
if(fw == NULL)
return 0;
while(~scanf("%d%d",&n,&l))
{
if(!n && !l)
break;
flag = 0;
cnt = 0;
dfs(0);
}
}