阿三出门游玩,遇到了一排任性的灯泡,这一排灯泡有亮有暗,而且有两个连续的灯泡坏掉了。
阿三是一个环保主义者,他希望把所有的灯泡关掉之后再离开. 除了端点的灯泡,每个灯泡都有唯一的一个开关,并且如果摁下pos位置上灯泡的开关,pos、pos-1和pos+1位置上的灯泡都会取反(即亮变暗、暗变亮) 问题是最少需要按下多少次开关,把所有的灯泡关掉. 保证两边端点的灯泡没有开关,并且都是暗的。 (来自出题人善意的提醒:坏掉的灯泡的开关并没有坏,按下之后边上灯也会受到控制(如果边上的灯没坏的话))
每组输入数据占一行是给定的01字符串,0代表暗,1代表亮,x代表坏掉了。 长度 < 1000; 保证输入的数据一定有两个连续的x
输出格式占一行,输出最少操作数。
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; }