演算法分析:特殊密碼鎖問題
上機程式碼:
#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;
}
}