思路:
枚举每一次卡牌初始翻转的位置dfs搜索之后的牌翻转情况.
PS:这题是一维的,HDU3279是二维翻转,同类型的
#include <cstring>
#include <stdio.h>
#include <algorithm>
#include <iostream>
using namespace std;
char s[100];
void turn (int x)
{
int i;
if(x==0)
{
i=0;
}
else
i=x-1;
for( i;i<=x+1;i++)
{
if(s[i]=='1')
s[i]='0';
else if(s[i]=='0')
s[i]='1';
}
}
int ans=999999;
void dfs(int pos,int step)
{
int len=strlen(s);
int over=1;
for(int i=0;i<len;i++)
{
if(s[i]!='0')
{
over=0;
break;
}
}
if(over)
{
ans=min(ans,step);
return ;
}
if(pos>=len)
return ;
for(int i=pos;i<len;i++)
{
turn(i);
int yes=1;
for(int i=0;i<len;i++)
{
if(s[i]!='0')
{
yes=0;
break;
}
}
if(yes)
{
ans=min(ans,step+1);
}
if(i+1<len)
dfs(i+1,step+1);
turn(i);
}
}
int main()
{
while(cin>>s)
{
ans=999999;
int len=strlen(s);
for(int i=0;i<len;i++)
{
dfs(i,0);
}
if(ans!=999999)
cout<<ans<<endl;
else
cout<<"NO"<<endl;
}
}