http://acm.hdu.edu.cn/showproblem.php?pid=2209
分析:第1张牌的状态只受两种影响:自己和第2张牌;判断前一张牌是否为正面
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
using namespace std;
const int NM=25;
int mmin,len,a[NM];
bool flag;
char str[NM];
void DFS(int t,int k)
{
if(t==len){
for(int i=0;i<len;i++){
if(a[i]) break;
}
if(i==len){
flag=true;
if(k<mmin) mmin=k;
}
return;
}
if(a[t-1]==1){
a[t-1]=1-a[t-1];a[t]=1-a[t];a[t+1]=1-a[t+1];
DFS(t+1,k+1);
a[t-1]=1-a[t-1];a[t]=1-a[t];a[t+1]=1-a[t+1];
}
DFS(t+1,k);
}
int main()
{
while(~scanf("%s",str)){
len=strlen(str);
for(int i=0;i<len;i++) a[i]=str[i]-'0';
mmin=0xfffffff;flag=false;
DFS(1,0); //第1张牌不动
a[0]=1-a[0];a[1]=1-a[1]; //第1张牌翻转
DFS(1,1);
if(flag) printf("%d\n",mmin);
else printf("NO\n");
}
return 0;
}