电子商务网站推广的主要方式,龙文网站建设,做网站国外访问,网络营销策划方案3000字题目#xff1a;特殊密码锁
001:特殊密码锁
描述
有一种特殊的二进制密码锁#xff0c;由n个相连的按钮组成#xff08;n30#xff09;#xff0c;按钮有凹/凸两种状态#xff0c;用手按按钮会改变其状态。
然而让人头疼的是#xff0c;当你按一个按钮时#x…题目特殊密码锁
001:特殊密码锁
描述
有一种特殊的二进制密码锁由n个相连的按钮组成n30按钮有凹/凸两种状态用手按按钮会改变其状态。
然而让人头疼的是当你按一个按钮时跟它相邻的两个按钮状态也会反转。当然如果你按的是最左或者最右边的按钮该按钮只会影响到跟它相邻的一个按钮。
当前密码锁状态已知需要解决的问题是你至少需要按多少次按钮才能将密码锁转变为所期望的目标状态。
输入
两行给出两个由0、1组成的等长字符串表示当前/目标密码锁状态其中0代表凹1代表凸。 输出 至少需要进行的按按钮操作次数如果无法实现转变则输出impossible。
样例输入
011
000
样例输出
1
解题思路首先我们能想到的是在确保x[i]之前的数据与y[i]相同的情况下我们可以通过改变x[i1]来使x[i]与y[i]保持相同最后通过比较最后一位是否相同或者比较x与y是否相同来判断两者最终的结果。这里需要注意的是x[0]的状态x[0]的状态有两种方法来改变一是通过改变x[1]来使x[0]改变二是通过改变x[0]自身来改变这里我们要分开讨论取两种情况下的最小值作为最后的结果。
代码
#include iostream
#include cstdio
#include cstdlib
#include cstring
#include math.h
#includealgorithm
using namespace std;
char a[32],b[32],c[32];
int count10,count20,a11e10,a21e10;
int len;
void switchs(int i)
{a[i-1]a[i-1]1?0:1;a[i]a[i]1?0:1;if(ilen-1)a[i1]a[i1]1?0:1;
}
int compare(int n)
{int an0;for(int i1;in;i){if(a[i-1]!b[i-1]){switchs(i);an;}}return an;
}
int main()
{while(cincb){len strlen(c);int sign 0;strcpy(a,c);count1compare(len);if(!strcmp(a,b)){a1count1;sign1;}strcpy(a,c);a[0]a[0]1?0:1;a[1]a[1]1?0:1;count2compare(len)1;if(!strcmp(a,b)){a2count2;sign1;}if(sign)coutmin(a1,a2)endl;else coutimpossibleendl;}return 0;
}