硬解法:
遍历一次开始点,从开始点往两端处理。
处理方式:“遇到不同就按”
最后处理完若和目标一致就为一次有效操作,与之前记录比较得出最小操作数。
#include <iostream>
using namespace std;
char turn(char a);
int main(){
string a , b ,temp;
cin >> temp >> b;
int num = temp.length() , minNum = num , sum;
for(int j = 0; j < num;j++){
sum = 0;
a = temp;
for(int i = j;i < num;i++){
if( a[i-1] != b[i-1] || (a[i] != b[i] && i == 0) ){
if(i != 0){
a[i-1] = turn(a[i-1]);
}
a[i] = turn(a[i]);
if(i != num-1){
a[i+1] = turn(a[i+1]);
}
sum++;
}
}
for(int i = j;i >= 0;i--){
if( a[i+1] != b[i+1] || (a[i] != b[i] && i == num-1) ){
if(i != 0){
a[i-1] = turn(a[i-1]);
}
a[i] = turn(a[i]);
if(i != num-1){
a[i+1] = turn(a[i+1]);
}
sum++;
}
}
if(a.compare(b) == 0){
minNum = min(sum , minNum);
}
}
if(minNum != num || minNum == 1){
cout << minNum;
}else{
cout << "impossible";
}
return 0;
}
char turn(char a){
if(a == '1'){
a = '0';
}else{a = '1';}
return a;
}