1. 程式人生 > >演算法分析:特殊密碼鎖問題

演算法分析:特殊密碼鎖問題

上機程式碼:

#include<iostream>  
#include<cstring>  
#include<algorithm>  
using namespace std;  
#define N 32
void SetBit(char &c){  //翻轉按鈕函式
    if(c=='0') c='1';
    else c='0';
}
void Change(char switchs[],int i,int length){  //
    if(i-1>=0) SetBit(switchs[i-1]);
    SetBit(switchs[i]);
    if(i+1<length)  SetBit(switchs[i+1]);
}
int main(){
    char ori[N],switchs[N],aim[N];
    int num1 = 0,num2 = 0,length = 0;
    int min_num=0;
    bool tag1=false,tag2=false;
    cin>>ori>>aim;
    length = strlen(ori);
    for(int k = 0;k<2;++k){
        memcpy(switchs,ori,sizeof(ori));
        if(k) //如果首位不翻轉成功時最少需要的次數
        { for(int i = 1;i<length;++i)
        {if(switchs[i-1]!=aim[i-1])
        {Change(switchs,i,length);
        ++num1;
        }
        }
        if(switchs[length-1] == aim[length-1]) tag1=true;
        else //如果首位翻轉成功時最少需要的次數
        {
            Change(switchs,0,length);
            ++num2;
            for(int j=1;j<length;++j){
                if(switchs[j-1]!=aim[j-1]){
                    Change(switchs,j,length);
                    ++num2;
                }
            }
            if(switchs[length-1]==aim[length-1])  tag2=true;
        }
        }
        if(tag1&&tag2) { min_num = min(num1,num2); cout<<min_num; }
        else if(tag1&&tag2 == false) {min_num = num1; cout<<min_num;}
        else if(tag2&&tag1 == false) {min_num = num2; cout<<min_num;}
        else
            cout<<"impossible"<<endl;
    }
}