001:特殊密码锁

001:特殊密码锁
总时间限制: 1000ms 内存限制: 1024kB
描述
有一种特殊的二进制密码锁,由n个相连的按钮组成(n<30),按钮有凹/凸两种状态,用手按按钮会改变其状态。

然而让人头疼的是,当你按一个按钮时,跟它相邻的两个按钮状态也会反转。当然,如果你按的是最左或者最右边的按钮,该按钮只会影响到跟它相邻的一个按钮。

当前密码锁状态已知,需要解决的问题是,你至少需要按多少次按钮,才能将密码锁转变为所期望的目标状态。

输入
两行,给出两个由0、1组成的等长字符串,表示当前/目标密码锁状态,其中0代表凹,1代表凸。
输出
至少需要进行的按按钮操作次数,如果无法实现转变,则输出impossible。
样例输入
011
000
样例输出
1
解析:此题用到枚举法,但是开关数最大为n,每个开关的状态有两种,所以总的枚举次数为2的n次方,肯定超时,但是注意到第一个开关是否打开,可以决定后面的开关状态,所以枚举次数为2,然后比较一下最后一个开关的状态就能判断是否可以达到目的。

#include 
#include 
using namespace std;
const int MAX = 30;

void sw(char a[], int i, int size=MAX){
	if(i==0)
		a[i+1] ^= 1;
	else if(i==size-1)
		a[i-1] ^= 1;
	else{
		a[i+1] ^= 1;
		a[i-1] ^= 1;
	}
	a[i] ^= 1;
}

int main(){
	char ori[MAX];//原状态 
	char v[MAX];//变化中的状态 
	char result[MAX];//目标状态
	int switchs[MAX];//开关状态 
	cin >> ori >> result;
	int n = strlen(ori);
	for(int k=0; k<2; ++k){
		for(int i=0; i

你可能感兴趣的:(001:特殊密码锁)