1 #include <cstdio> 2 #include <iostream> 3 #include <queue> 4 #include <vector> 5 #include<string.h> 6 #include<map> 7 #include<bits/stdc++.h> 8 #define LL long long 9 #define maxn 1005 10 using namespace std; 11 int n,L,cnt; 12 int s[100]; 13 void dfs(int cur) 14 { 15 if(cnt==n) 16 { 17 for(int i=0;i<cur;i++) 18 { 19 if(i%64==0&&i>0)printf(" "); 20 else if(i%4==0&&i>0)printf(" "); 21 printf("%c",'A'+s[i]); 22 } 23 printf(" %d ",cur); 24 return; 25 } 26 for(int i=0;i<L;i++) 27 { 28 int ok=1; 29 s[cur]=i; 30 for(int j=1;2*j<=cur+1;j++) 31 { 32 int equals=1; 33 for(int k=0;k<j;k++) 34 { 35 if(s[cur-k]!=s[cur-k-j]) 36 { 37 equals=0;break; 38 } 39 } 40 if(equals) 41 { 42 ok=0;break; 43 } 44 } 45 if(ok){ 46 cnt++; 47 dfs(cur+1); 48 } 49 } 50 } 51 int main() 52 { 53 while(scanf("%d %d",&n,&L)==2,n) 54 { 55 cnt=0; 56 dfs(0); 57 } 58 return 0; 59 }
思路:
利用回溯法,深度优先搜索每个串的下一个字符。对于搜索到的字符看它是否合法,不用再看之前搜索到的字符是否合法,因为不合法的情况已经被剪枝掉了。需要检查的最大的串长为本串的一半长度(2*j<=cur+1)。
注意点:
1.对于输出的时候,有一个数字转字符串的过程。printf("%c",'A'+s[i]);