UVA-129 Krypton Factor(回溯)
题目大意:由字母A到Z组成的字符串,其中有两个子串完全相同的叫做容易的串,反之叫困难的串。找出由前L个字母组成的第n个困难的串。
题目分析:简单回溯,不过要判断是否存在重复子串比较棘手。《入门经典》上借鉴八皇后问题,只判断添进字符后是否存在连续子串。具体做法是这样的,以长度为对象枚举以新添进字符为尾巴的子串,看是否重复。
代码如下:
# include<iostream> # include<cstdio> # include<cstring> # include<algorithm> using namespace std; int n,k,cnt,path[1000]; void dfs(int cur) { if(cur>81) return ; if(cnt++==n){ for(int i=0;i<cur;++i){ printf("%c",char(path[i]+'A')); if(i%4==3&&i!=cur-1){ if(i%64==63) printf("\n"); else printf(" "); } } printf("\n%d\n",cur); return ; } for(int i=0;i<k;++i){ path[cur]=i; int flag=1; for(int j=1;j*2<=cur+1;++j){ int ok=1; for(int l=0;l<j;++l) if(path[cur-l]!=path[cur-l-j]){ ok=0; break; } if(ok){ flag=0; break; } } if(flag) dfs(cur+1); if(cnt>n) return ; } } int main() { while(scanf("%d%d",&n,&k)&&(n+k)) { cnt=0; dfs(0); } return 0; }