算法与程序设计习题1-1
# 001:特殊密码锁
总时间限制:
1000ms
内存限制:
1024kB
描述
有一种特殊的二进制密码锁,由n个相连的按钮组成(n<30),按钮有凹/凸两种状态,用手按按钮会改变其状态。
然而让人头疼的是,当你按一个按钮时,跟它相邻的两个按钮状态也会反转。当然,如果你按的是最左或者最右边的按钮,该按钮只会影响到跟它相邻的一个按钮。
当前密码锁状态已知,需要解决的问题是,你至少需要按多少次按钮,才能将密码锁转变为所期望的目标状态。
输入
两行,给出两个由0、1组成的等长字符串,表示当前/目标密码锁状态,其中0代表凹,1代表凸。
输出
至少需要进行的按按钮操作次数,如果无法实现转变,则输出impossible。
## 本题是一个采用枚举策略的题目,刚开始想的解法是同过对比每一个字符,若不同则按下它后面一个键,并翻转后面两个字符串,可以通过样列但始终是WA,后来发觉少算了一种情况,当第一个或第二个字符不同时可以按下第一个键,这样枚举的情况才是完全的。
1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 5 string a,b,c; 6 int ans=1e8; 7 8 void set(char &n) 9 { 10 if( n=='0') 11 { 12 n='1'; 13 } 14 else 15 { 16 n='0'; 17 } 18 } 19 int main() 20 { 21 cin>>a>>b; 22 c=a; 23 int m=a.size(); 24 int j=0; 25 int i; 26 int x=1; 27 for( i=0;i<m-1;i++) 28 { 29 if(a[i]!=b[i]) 30 { 31 set(a[i+1]); 32 if(i<m-2) 33 { 34 set(a[i+2]); 35 } 36 j++; 37 } 38 } 39 if(a[m-1]==b[m-1]) 40 { 41 ans=j; 42 } 43 a=c; 44 if(a[0]!=b[0]||a[1]!=b[1]) 45 { 46 set(a[0]); 47 set(a[1]); 48 } 49 for( i=0;i<m-1;i++) 50 { 51 if(a[i]!=b[i]) 52 { 53 set(a[i+1]); 54 if(i<m-2) 55 { 56 set(a[i+2]); 57 } 58 x++; 59 } 60 } 61 if(a[m-1]==b[m-1]) 62 { 63 if(ans>x) 64 ans=x; 65 } 66 if(ans!=1e8) 67 { 68 cout<<ans; 69 } 70 else 71 { 72 cout<<"impossible"; 73 } 74 return 0; 75 }
浙公网安备 33010602011771号