题目链接
http://acm.hdu.edu.cn/showproblem.php?pid=2209
这个题难度还可以
我的思路:有n张牌成第一张牌开始如果是1,则第一张第二张第三张翻转,再看第二张,判断如果是1则第二张第三张第四张翻转,以此下去
不这样还不可以,还得分两种情况如001 按这种思路是不可以的所以还有一种情况不管如何先翻转第一和第二张牌再如上一种思路。
我的AC代码
第一种写法:直接法
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int a[30];
char str[30];
int main(void)
{
int i,ans;
int f1,f2;
while(scanf("%s",str)==1)
{
int len=strlen(str);
int k1,k2;
f1=0; f2=0;
for(i=0;i<len;i++)
a[i]=str[i]-‘0‘;
a[0]=!a[0];
a[1]=!a[1];
k1=1;
for(i=1;i<len;i++)
{
if(a[i-1])
{
a[i-1]=!a[i-1];
a[i]=!a[i];
a[i+1]=!a[i+1];
k1++;
}
}
if(a[len-1]==0)
f1=1;
k2=0;
for(i=0;i<len;i++)
a[i]=str[i]-‘0‘;
for(i=1;i<len;i++)
{
if(a[i-1])
{
a[i-1]=!a[i-1];
a[i]=!a[i];
a[i+1]=!a[i+1];
k2++;
}
}
if(a[len-1]==0)
f2=1;
if(f1&&f2)
{
if(k1>k2)
printf("%d\n",k2);
else
printf("%d\n",k1);
}
else if(f1)
printf("%d\n",k1);
else if(f2)
printf("%d\n",k2);
else
printf("NO\n");
}
return 0;
}
第二种写法:递归
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int a[30];
char str[30];
const int inf=1<<30;
int main(void)
{
int dfs(int i,int len,int k);
int i;
while(scanf("%s",str)==1)
{
int ans=inf;
int len=strlen(str);
for(i=0;i<len;i++)
a[i]=str[i]-‘0‘;
a[0]=!a[0];
a[1]=!a[1];
ans=min(ans,dfs(1,len,1));
for(i=0;i<len;i++)
a[i]=str[i]-‘0‘;
ans=min(ans,dfs(1,len,0));
if(ans==inf)
printf("NO\n");
else
printf("%d\n",ans);
}
return 0;
}
int dfs(int i,int len,int k)
{
if(i==len)
{
if(a[i-1])
return inf;
else
return k;
}
if(a[i-1])
{
a[i-1]=!a[i-1];
a[i]=!a[i];
a[i+1]=!a[i+1];
k++;
}
dfs(i+1,len,k);
}
hdu 2209 翻纸牌游戏