http://acm.hdu.edu.cn/showproblem.php?pid=2209

艰难的一题,对回溯法的理解又深刻了

View Code
#include <iostream>
using namespace std ;
int q[25] ;
int cnt[25] ;
int len ;
int ans ;
bool gao()
{
    for(int i=0;i<len;i++)
        if(q[i])
            return false ;
    return true ;
}
void dfs(int idx)
{
    if(gao())
    {
        int temp=0 ;
        for(int i=0;i<len;i++)
            if(cnt[i]==1)
                temp++ ;
        if(temp<ans)
            ans=temp ;
        return ;
    }
    if(idx>=len)
        return ;
    for(cnt[idx]=0;cnt[idx]<2;)
    {
        q[idx]^=1 ;
        if(idx>0)
            q[idx-1]^=1 ;
        if(idx<len)
            q[idx+1]^=1 ;
        cnt[idx]++ ;
        dfs(idx+1) ;
    }
}
int main()
{
    char str[25] ;
    while(~scanf("%s",str))
    {
        len=strlen(str) ;
        ans=0xfffffff ;
        for(int i=0;i<len;i++)
            q[i]=str[i]-'0' ;
        memset(cnt,0,sizeof(cnt)) ;
        dfs(0) ;
        if(ans!=0xfffffff)
            printf("%d\n",ans) ;
        else
            puts("NO") ;
    }
    return 0 ;
}