http://poj.org/problem?id=3185
n个数,每次改变(0->1,1->0)三个数(自身和左右两侧),问最少多少步可以变为全为0.
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
int a[21]={0}; //数字
int f[21]={0}; //是否转
int ans=100;
int tmp;
int main(){
for (int i=1;i<=20;i++){
cin >> a[i];
}
f[1]=tmp=1; //假设翻第一个
for (int i=2;i<=20;i++){
if (f[i]=(f[i-2]^f[i-1]^a[i-1])) tmp++;
}
if (tmp<ans&&(f[19]^f[20]^a[20])==0) ans=tmp;
f[1]=tmp=0; //假设不翻第一个
for (int i=2;i<=20;i++){
if (f[i]=(f[i-2]^f[i-1]^a[i-1])) tmp++;
}
if (tmp<ans&&(f[19]^f[20]^a[20]==0)) ans=tmp;
cout << ans << endl;
}