蓝桥杯 Bit Compressor(DFS+剪枝)

题目:

蓝桥杯 Bit Compressor(DFS+剪枝)_第1张图片

输入输出:

蓝桥杯 Bit Compressor(DFS+剪枝)_第2张图片

代码:

#include 
#include 
#include 
using namespace std;

int l,n,len;
char ch[45];
int zeroNum,ans;

void Dfs(int k,int zero,int one) //第一个参数表示指向压缩后字符串的第k位 第二个参数表示当前0的个数 第三个参数表示当前1的个数
{
    if(ans > 1) return;   //ans大于1时 说明不止一种情况 直接返回即可
    if(zero > zeroNum) return;
    if(one > n) return;
    if(k == len)
    {
        if(zero==zeroNum&&one==n) ans++;
        return;
    }
    int tmpZero=0;
    while(ch[k]=='0')  //这里对应的初始的时候前面可能有若干个0
    {
        ++k;
        tmpZero++;
    }
    int oneNum = 1;
    for(int j=k;j<len;++j,oneNum=oneNum*2+(ch[j]=='1'))
    {
        if(oneNum == 2) continue;   //oneNum对应 10 因为10对应的原串为 11 所以不会压缩
        if(ch[j+1] == '1') continue;
        int i = j+1;
        while(ch[i]=='0') ++i;
        Dfs(i,zero+tmpZero+i-j-1,one+oneNum);
        if(oneNum == 3)     // oneNum对应 11 对应着原串的两种情况 其一原串为11 其二原串为111
            Dfs(i,zero+tmpZero+i-j-1,one+2);
    }
}

int main()
{
    while(~scanf("%d%d",&l,&n))
    {
        ans = 0;
        scanf("%s",ch);
        len = strlen(ch);
        zeroNum = l - n;   //源字符串中0的个数
        Dfs(0,0,0);
        if(ans == 1)
            printf("YES\n");
        else
            if(ans > 1)
                printf("NOT UNIQUE\n");
            else
                printf("NO\n");
    }
    return 0;
}

你可能感兴趣的:(#,DFS)