uva129困难的串(dfs+判断)


思路:就是检查每一个位置应该填什么,并且填完要保证是不能有相邻的自子串,只需要从后向前枚举长度i = 2.....(当前字符串长度 + 1) / 2,然后判断一下就行,具体看代码,有点乱。。


代码:


#include <cstdio>
#include <cstring>

int n,l;
char ans[100];
int flag;
int cnt ;

FILE *fw;
bool check(char c ,int cur)

{
     for(int i = 2;i * 2 <= cur + 1;++i)
     {
         int ok = 1;
         if(c != ans[cur - i])
            continue;
         for(int j = cur - 1,k = cur - i - 1; j > cur - i ;--j,--k)
            if(ans[j] != ans[k]){
               ok = 0;
               break;
            }
        if(ok)
            return false;

     }
     return true;
}
void dfs(int s)

{
    if(cnt == n)
    {
       ans[s] = '\0';
       int len = strlen(ans);
       int f = 1;
       for(int i = 0;i < len;++i)
       {
           if(i == 64)
              printf("\n");
           if(i % 4 == 0 && i && i != 64)
              printf(" ");
           printf("%c",ans[i]);
       }
      // fprintf(fw,"\n%d\n",len);
      printf("\n%d\n",len);
       flag = 1;
       return ;
    }
    if(flag)
        return ;
    for(int i = 0;i < l;++i)
    {
        if(s == 0)
        {
            ans[s] = i + 'A';
            cnt++;
            dfs(s + 1);
        }
        else if(ans[s - 1] != i + 'A' && check(i + 'A',s))
        {
            ans[s] = i + 'A';
            cnt++;
            dfs(s + 1);
        }
    }

}
int main()

{
    fw = fopen("output.txt","w");
    if(fw == NULL)
        return 0;
    while(~scanf("%d%d",&n,&l))
    {

        if(!n && !l)
            break;
        flag = 0;
        cnt = 0;
        dfs(0);
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值