题目链接
枚举+剪枝=回溯
解题思路:首先要暴力出结果,然后在每个位置合法做判断,本题中里判断字符串是否是困难串,也就是找出所有偶数串,判断是否含有重复,在递归判断中不需要找出所有子串,只需要判断当前位置作为后缀结束,一次遍历1~cur+1/2即可。
C++代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=1000;
int A[maxn],n,L,ans;
int dfs(int cur){
if(ans++==n){
for(int i=0;i<cur;i++){
if(i&&i%(4*16)==0) cout<<endl;
else if(i&&i%4==0) cout<<" ";
printf("%c",A[i]+'A');
}
cout<<endl<<cur<<endl;
return 1;
}
for(int i=0;i<L;i++){
int ok=1;
A[cur]=i;
for(int j=1;j*2<=cur+1;j++){
int equal=1;
for(int k=0;k<j;k++) if(A[cur-k]!=A[cur-k-j]){equal=0;break;}
if(equal){ok=0;break;}
}
if(ok) if(dfs(cur+1)) return 1;
}
return 0;
}
int main(){
while(memset(A,0,sizeof(A)),ans=0,cin>>n>>L&&n&&L) dfs(0);
return 0;
}