【题解】001:特殊密码锁

http://cxsjsxmooc.openjudge.cn/2018t2winterw1/001/

提示:找出枚举类题目的局部是什么,以小见大求全部,从而避免枚举大量情况

观察:前i个可以推出第i+1个的情况

启示:关注问题本身的解决方案和实现过程,并非案例给的情形拼凑


#include<memory>
#include<string> 
#include<cstring>
#include<cstdio>
#include<iostream>
using namespace std;
char a[40],b[40];
int now=0,change=0,goal=0;
int len;
int ans=40,sumnow=0;

int GetBit(int num, int i)
{
    return (num >> i) & 1;
}

int SetBit(int i, int v)
{
    int sum=0;
    if(v) sum |= (1 << (i));
    else sum &= ~(1 << (i));
    return sum;
}

void FlipBit(int &change, int i)
{
    change ^= (1 << i);
}

void ClickBit(int &change, int i)
{
    if(i>=0&&i<=len-1)
    {
        sumnow++;
        if(i==0) 
        {
            FlipBit(change, i);
            FlipBit(change, i+1);
        //    printf("改变1:i=%d,i+1=%d\n",i,i+1);
        }
        else if(i==len-1)
        {
            FlipBit(change, i);
            FlipBit(change, i-1);
        //    printf("改变2:i=%d,i-1=%d\n",i,i-1);
        }
        else
        {
            FlipBit(change, i);
            FlipBit(change, i-1);
            FlipBit(change, i+1);
        //    printf("改变3:i-1=%d,i=%d,i+1=%d\n",i-1,i,i+1);
        } 
    }
}
/*bool CmpBit(int &change, int &goal, int i)
{
    printf("此时的第%d位change=%d,goal=%d\n",i,change,goal);
    if(GetBit(change,i) == GetBit(goal,i)) return 1;
    else return 0;
}*/ 
void Ans(int v)
{
    sumnow = 0;
    change = now;
    //printf("开始:change=%d\n",change);
    if(v)
    {
        ClickBit(change, 0);
    }
    for(int j=0;j<len;++j)
    {
        //printf("v=%d:j=%d,change=%d,goal=%d,sumnow=%d\n",v,j,change,goal,sumnow);// 
        //printf("change第%d位=%d,goal第%d位=%d\n",j,GetBit(change,j),j,GetBit(goal,j));
        if(GetBit(change,j) == GetBit(goal,j))
        {
            if(change == goal)
            {
                if(sumnow < ans) {ans = sumnow;}// printf("按下:j=%d,ans=%d\n",j,ans);
                else break;
            }
            continue;
        }
        else
        {
            if(j!=len-1)ClickBit(change,j+1);
            //printf("change=%d\n",change);
            continue;
        }
    }
}
int main()
{
    int i,j;
    gets(a);
    gets(b);
    len = strlen(a);
    //printf("a=%s,b=%s,goal=%d\n",a,b,goal);
    for(i=0;i<len;++i)
    {
        if(a[i]=='0') now += SetBit(i,0);
        if(a[i]=='1') now += SetBit(i,1);
        if(b[i]=='0') goal += SetBit(i,0);
        if(b[i]=='1') goal += SetBit(i,1);
        //printf("i=%d,a[%d]=%c,now=%d,b[%d]=%c,goal=%d\n",i,i,a[i],now,i,b[i],goal);//
    } 
    //printf("now=%d,goal=%d\n",now,goal);//
    //第0个开关按下
    Ans(1);
    //第0个开关不按 
    Ans(0);
    //没答案
    if(ans == 40) printf("impossible");
    else printf("%d",ans);
    return 0;

猜你喜欢

转载自blog.csdn.net/zjt1027/article/details/82557608