算法与程序设计习题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 } 

 

posted @ 2018-09-05 19:25  Zw1999  阅读(510)  评论(0)    收藏  举报