HDOJ —2009 翻纸牌游戏
01 011
NO 1
#include<stdio.h>
#include<string>
using namespace std;
int Max=10000000,count=0;
char str[20];
int isthere(int t,char restr[20])
{
int ishave=0;
if(t-2>=0)
{
for(int i=0;i<=t-2;i++)
if(restr[i]=='1')
ishave=1;
}
return ishave;
}
void back(int t,int n,char restr[20]) //t初始为0;n表示长度,在搜索过程中应保存每一种情况的结果,显然要用全局变量数组保存
{
if(t>=n)
{
if(!strstr(restr,"1")&&Max>count) //如果str中不存在1
{
Max=count;
}
}
else
{
for(int i=0;i<=1;i++)
{
if(i==1) //置换规则
{
restr[t]=97-restr[t];
if(t!=0) restr[t-1]=97-restr[t-1];
if(t!=n-1) restr[t+1]=97-restr[t+1];
count++;
}
if(!isthere(t+1,restr)) //截枝函数
back(t+1,n,restr);
if(i==1) // 还原restr数组中改变的元素值
{
restr[t]=97-restr[t];
if(t!=0) restr[t-1]=97-restr[t-1];
if(t!=n-1) restr[t+1]=97-restr[t+1];
count--;
}
}
}
}
int main() //这一题试图采用搜索算法解决问题(子集树)
{
while(scanf("%s",str)!=EOF)
{
char restr[20];
int n=strlen(str);
strcpy(restr,str);
back(0,n,restr);
if(Max<10000000) printf("%d\n",Max);
else printf("NO\n");
Max=10000000;
}
return 0;
}