1. 程式人生 > >openjudge-特殊密碼鎖

openjudge-特殊密碼鎖

描述

有一種特殊的二進位制密碼鎖,由n個相連的按鈕組成(n<30),按鈕有凹/凸兩種狀態,用手按按鈕會改變其狀態。

然而讓人頭疼的是,當你按一個按鈕時,跟它相鄰的兩個按鈕狀態也會反轉。當然,如果你按的是最左或者最右邊的按鈕,該按鈕只會影響到跟它相鄰的一個按鈕。

當前密碼鎖狀態已知,需要解決的問題是,你至少需要按多少次按鈕,才能將密碼鎖轉變為所期望的目標狀態。

輸入

兩行,給出兩個由0、1組成的等長字串,表示當前/目標密碼鎖狀態,其中0代表凹,1代表凸。
輸出
至少需要進行的按按鈕操作次數,如果無法實現轉變,則輸出impossible。

樣例輸入

011
000

樣例輸出

1

#include<memory>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 32 
using namespace std;
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 oriswitchs[N]; char switchs[N]; char aim[N]; int num1 = 0,num2 = 0,length = 0; int min_num=0; bool tag = false; cin >> oriswitchs >> aim; length = strlen
(oriswitchs); for(int k = 0 ; k < 2 ; ++k) { //列舉首位是否操作 memcpy(switchs,oriswitchs,sizeof(oriswitchs)); 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]) tag=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]) tag=true; } } if(tag) { min_num = min(num1,num2); cout << min_num; } else { cout << "impossible"; } return 0; }

通過列舉來解決問題,前一個位置狀態不對,那就變化當前位置,由前向後,上一個位置狀態一旦確定,那麼下一位置狀態也就確定,

兩種情況

第一個位置操作
第一個不操作
兩種情況都處理,然後輸出操作次數少的