a:特殊密码锁
- 总时间限制:
- 1000ms
- 内存限制:
- 1024kB
- 描述
-
有一种特殊的二进制密码锁,由n个相连的按钮组成(n<30),按钮有凹/凸两种状态,用手按按钮会改变其状态。
然而让人头疼的是,当你按一个按钮时,跟它相邻的两个按钮状态也会反转。当然,如果你按的是最左或者最右边的按钮,该按钮只会影响到跟它相邻的一个按钮。
当前密码锁状态已知,需要解决的问题是,你至少需要按多少次按钮,才能将密码锁转变为所期望的目标状态。
- 输入
- 两行,给出两个由0、1组成的等长字符串,表示当前/目标密码锁状态,其中0代表凹,1代表凸。
- 输出
- 至少需要进行的按按钮操作次数,如果无法实现转变,则输出impossible。
- 样例输入
-
011 000
- 样例输出
-
1
- 这个是齐齐问的一道好题,因为你很难想到这个题的做法就是贪心枚举,疑惑就是按不按第一个按钮
#include <bits/stdc++.h> using namespace std; string s,gs; int a[34],b[34],n=0,f1=0,f2=0,c[34]; int main() { cin>>s>>gs; for(int i=0; s[i]; i++) a[i+1]=s[i]-'0',b[i+1]=gs[i]-'0',c[i+1]=s[i]-'0',n++; for(int i=2; i<=n; i++) if(a[i-1]!=b[i-1]) { a[i-1]^=1; a[i]^=1; a[i+1]^= 1; ++f1; } int t1=1,t2=1; for(int i=1; i<=n; i++) if(a[i]!=b[i]) { t1=0; break; }; c[1]^=1; c[2]^=1; ++f2; for(int i=2; i<=n; i++) if(c[i-1]!=b[i-1]) { c[i-1]^= 1; c[i]^= 1; c[i+1]^=1; ++f2; } for(int i=1; i<=n; i++) if(c[i]!=b[i]) { t2=0; break; } if(t1&&t2)return cout<<min(f1,f2)<<endl,0; if(t1) return cout<<f1<<endl,0; if(t2) return cout<<f2<<endl,0; cout<<"impossible"<<endl; return 0; }