7.4.3困难的串
学习点:dfs加入返回值,递归搜索过程中如果有一个成功,就直接退出
//7.4.3 困难的串 #include<cstdio> #include<cstring> #include<iostream> #include<string> #include<algorithm> using namespace std; int n,L; int cnt; char v[81]; bool judge(int cur) { for(int i=1;i<=(cur+1)/2;i++)//判断长度为2*i的后缀是否有相同的 { bool equal=1; for(int j=0;j<i;j++) if(v[cur-i-j]!=v[cur-j]) { equal=0; break; } if(equal) return false; } return true; } int dfs(int cur) { //printf("cur: %d ", cur); for(int i=0;i<L;i++) { v[cur]='A'+i; if(judge(cur)) { cnt++; if(cnt==n) { v[cur+1]=0; printf("%s ", v); return 1; } if(dfs(cur+1)) return 1; } } return 0; } int main() { while(cin>>n>>L) { cnt=0; dfs(0); } return 0; }
修改一下输出格式即可解决uva129
//7.4.3 困难的串 #include<cstdio> #include<cstring> #include<iostream> #include<string> #include<algorithm> using namespace std; int n,L; int cnt; char v[81]; bool judge(int cur) { for(int i=1;i<=(cur+1)/2;i++)//判断长度为2*i的后缀是否有相同的 { bool equal=1; for(int j=0;j<i;j++) if(v[cur-i-j]!=v[cur-j]) { equal=0; break; } if(equal) return false; } return true; } void output(int cur) { for(int i=0;i<=cur;i++) { if(i%4==0 && i>0) { if(i%64==0 && i>0) putchar(' '); else putchar(' '); } putchar(v[i]); } printf(" %d ", cur+1); } int dfs(int cur) { //printf("cur: %d ", cur); for(int i=0;i<L;i++) { v[cur]='A'+i; if(judge(cur)) { cnt++; if(cnt==n) { v[cur+1]=0; //printf("%s ", v); output(cur); return 1; } if(dfs(cur+1)) return 1; } } return 0; } int main() { while(cin>>n>>L && n && L) { cnt=0; dfs(0); } return 0; }