任性的阿三 sdut 3528

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
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;
}

你可能感兴趣的:(任性的阿三 sdut 3528)