http://acm.hdu.edu.cn/showproblem.php?pid=2209
艰难的一题,对回溯法的理解又深刻了
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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 ; }