运用回溯法,是否包含两个相邻的的字串只需要判断当前串的后缀
代码如下:
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <string>
#include <cstdio>
#include <climits>
#include <cmath>
using namespace std;
int n,l,cnt,times=0;
int A[99];
int dfs(int cur){ //回溯法
if(cnt++==n){
int times=0;
for(int i=0;i<cur;i++){
printf("%c",'A'+A[i]-1); times++;
if(times%4==0){
if(times<cur&×!=64)
printf(" ");
}
if(times==64&&cur>64){
printf("\n");
}
}
printf("\n%d\n",cur);
return 0;
}
for(int i=0;i<l;i++){
int OK=1;
A[cur]=i+1;
for(int j=1;j*2<=cur+1;j++){
int equal=1;
for(int z=0;z<j;z++)
if(A[cur-z]!=A[cur-z-j]){
equal=0;break;
}
if(equal){OK=0;break;}
}
if(OK)
if(!dfs(cur+1)) return 0;
}
return 1;
}
int main(){
#ifdef DID
freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
#endif
while(scanf("%d%d",&n,&l)!=EOF&&(n||l)){
cnt=0;
memset(A,0,sizeof(A));
int kk=dfs(0);
}
return 0;
}