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;
}

  

上一篇:Spark算子总结及案例


下一篇:linux:正则表达式grep命令