Problem Description
阿三出门游玩,遇到了一排任性的灯泡,这一排灯泡有亮有暗,而且有两个连续的灯泡坏掉了。
阿三是一个环保主义者,他希望把所有的灯泡关掉之后再离开.
除了端点的灯泡,每个灯泡都有唯一的一个开关,并且如果摁下pos位置上灯泡的开关,pos、pos-1和pos+1位置上的灯泡都会取反(即亮变暗、暗变亮)
问题是最少需要按下多少次开关,把所有的灯泡关掉.
保证两边端点的灯泡没有开关,并且都是暗的。
(来自出题人善意的提醒:坏掉的灯泡的开关并没有坏,按下之后边上灯也会受到控制(如果边上的灯没坏的话))
Input
每组输入数据占一行是给定的01字符串,0代表暗,1代表亮,x代表坏掉了。
长度 < 1000;
保证输入的数据一定有两个连续的x
Output
输出格式占一行,输出最少操作数。
Example Input
01110xx110 0111001xx
Example Output
2 2
Hint
Author
2015级《程序设计基础II》计科软件通信期末上机考试2
#include<bits/stdc++.h>
using namespace std;
char s[1005];
int a[1005];
int main()
{
while(~scanf("%s",s))
{
memset(a,0,sizeof(a));
int len=strlen(s);
int i=0;
while(s[i]!='x')
{
if(s[i]=='1')
{
a[i+1]=1;
s[i]='0';
if(s[i+1]=='0')
s[i+1]='1';
else if(s[i+1]=='1')
s[i+1]='0';
if(s[i+2]=='0')
s[i+2]='1';
else if(s[i+2]=='1')
s[i+2]='0';
}
i++;
}
i=len-1;
while(s[i]!='x')
{
if(s[i]=='1')
{
a[i-1]=1;
s[i]='0';
if(s[i-1]=='0')
s[i-1]='1';
else if(s[i-1]=='1')
s[i-1]='0';
if(s[i-2]=='1')
s[i-2]='0';
else if(s[i-2]=='0')
s[i-2]='1';
}
i--;
}
/*for(i=0;i<=len-1;i++)
{
printf("%d ",a[i]);
}*/
int count=0;
for(i=0; i<=len-1; i++)
{
if(a[i]==1) count++;
}
printf("%d\n",count);
}
return 0;
}