uva129 - Krypton Factor 7.4.3 困难的串

 

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\n", 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\n", 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('\n');
            else
                putchar(' ');
        }
        putchar(v[i]);
    }
    printf("\n%d\n", cur+1);
}
int dfs(int cur)
{
    //printf("cur: %d\n", 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\n", 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;
}

你可能感兴趣的:(uva)