Krypton Factor UVA

来源:互联网 发布:2016淘宝主图尺寸大小 编辑:程序博客网 时间:2024/05/17 05:08

题目链接

枚举+剪枝=回溯
解题思路:首先要暴力出结果,然后在每个位置合法做判断,本题中里判断字符串是否是困难串,也就是找出所有偶数串,判断是否含有重复,在递归判断中不需要找出所有子串,只需要判断当前位置作为后缀结束,一次遍历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;}
原创粉丝点击