openjudge 特殊密码锁(开关问题)

来源:互联网 发布:淘宝店铺运营助手在哪 编辑:程序博客网 时间:2024/05/19 00:48

特殊密码锁

  • 查看
  • 提交
  • 统计
  • 提问
总时间限制: 
1000ms 
内存限制: 
1024kB
描述

有一种特殊的二进制密码锁,由n个相连的按钮组成(n<30),按钮有凹/凸两种状态,用手按按钮会改变其状态。

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

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

输入
两行,给出两个由0、1组成的等长字符串,表示当前/目标密码锁状态,其中0代表凹,1代表凸。
输出
至少需要进行的按按钮操作次数,如果无法实现转变,则输出impossible。
样例输入
011000
样例输出
1
tips:典型的开关问题,思路;
枚举第一个数字的翻转情况;
然后每次比较前一个数字是否与目的串相符,不符的话当前数字必须翻转;
最后看最后一个数字是否相符;
#include<iostream>#include<algorithm>#include<cstring>using namespace std;string s1,s2;int tmp[333];//标志当前是否进行翻转 bool equal(int x){int cnt=tmp[x]+tmp[x-1]+tmp[x+1];if(cnt%2==0)return s1[x]==s2[x]; else return s1[x]!=s2[x];}int cal(){for(int i=1;i<s1.size();i++){if(!equal(i-1)){tmp[i]=1; } }if(!equal(s1.size()-1))return -1;int cnt=0;for(int i=0;i<s1.size();i++){cnt+=tmp[i];}return cnt;}int main(){cin>>s1>>s2;int ans=-1;for(int i=0;i<=1;i++){memset(tmp,0,sizeof(tmp));tmp[0]=i;int t=cal();if(t>=0){if(ans<0)ans=t;else ans=min(ans,t);}}if(ans==-1)cout<<"impossible"<<endl;else cout<<ans<<endl;return 0;}


原创粉丝点击