問題の説明
手ボタンがその状態を変化させることにより、N組成(N <30)で接続された特殊なバイナリ組み合わせロックボタンは、ボタンが凹面/凸面2つの状態があり、そこです。
しかし、頭痛は、ボタンを押したときにときに、2つのボタンの状態は、逆にも隣接していると言っているということです。もちろん、あなたは左のみボタンのことわざに隣接影響する最も一番右のボタンを押す場合。
現在のロック状態は、問題を解決する必要があり、知られているあなたは所望の目標状態にロックするために、少なくとも何回ボタンに応じて必要があります。
0は、凹面、凸面表しを表し、現在の/目標のロック状態を表し、1と0の二つの他の長い文字列で与えられる二つの入力ライン、。出力は、少なくとも変更は出力が不可能、達成できない場合は、操作の数のボタンを押す必要があります。
サンプル入力
011 000
サンプル出力
1つの
分析:
:最初にすべてのあなたは2つの結論を得ることができ、問題の分析を通じて、列挙することによりこの問題を解決するための
オン/オフ、プレス対応するボタン/すべてのことに従わない:実際には、2つのだけの状態は、ボタン1.をプレス一度だけで、ほとんどのボタンが
2各ボタンが押された順序が最終的な結果には影響ありません
一般的な考え方を:
私たちの究極の目標は、ボタン配列の2つのセットが等しいに対応することです、すべてが等しいため、対応する二つのボタンに相当します私たちは、順番に各文字を比較し、左からのこのような分析として右に、配列に同意することができます
まず、現在のボタンが押され、第二が押下されています。彼らは、次の等しい比較している場合、等しくない場合、あなたは状態を反転させることができ、2つの方法がありますボタンを押します。前者の場合は、フロントフリップ(特殊なケースを除去し、下記参照)上のボタンが、
後者は、前者はボタンに影響を及ぼしません。*特殊なケース:最初のボタンが同時にいない場合、あなたが最初のフリップ方法を取る場合は、ボタンが(実際には存在しない)の元には影響しません、
しかし、あなたは、元の最初のアプローチをとっている場合は、第二のボタンから始まりますボタンは、ボタンを反転させる方法でなければならない第二ボタンの初めから、そのため、影響を受けるだろう。
*説明:あなたは番目のボタンから起動する場合は、上記の一般的な考え方からは、まだ、これはフロントのボタンの一貫性を回復するために、分析を続けた場合、それは確かに、一貫性のフロントボタンを損なう、最初の反転を意味しない取ります外はほぼ3つの方法が
。まず、他の前に左のボタンを押す3つの現在のボタンが(この時点では、現在のボタンが押された2回)押すと、前面のボタンを押して
、最初のアプローチのために、問題の規模を元のスケールに向けて回復し、元のスケールに向けた可能性回復の規模第二のアプローチのための解決策になると状態でボタンをリセットすることはできません始めた
要約、結論:最初のボタンに加えて、他のすべてのボタンは、あなたがそれを変更したいです状態は、その状態は、(左から右の分析に条約に対応する)、その後のボタンの状態によって変化させることができます
簡単に言えば:最初のボタンについては、議論の分類:のみボタンを押して次の1.を押し、他のボタンの隣に現在のボタン2.ボタンを押して、
次のようにコードは次のとおりです。
1つの#include <iostreamの> 2の#include <CStringの> 3。 使用した 名前空間STD; 4 5。 ボイド Flipone(チャー&S); // フリップ単一素子 6。 INT GetMin(INT *); // 取ら最小数 。7 。8 INT CNT [ 2 ] = { 0 }; 9 10 のint main()の 11 { 12は チャー A [ 35 ]、B [ 35 ]、C [ 35 ]; 13である CIN >> AB; 14 INT LEN = STRLEN(A); 15 用(INT P = 0 ; P < 2 ; P ++){ // 2例が議論されている 16 のstrcpy(C、A)を、 17 IF(P == 1。){ 18は Flipone(C [ 0 ]); 19 Flipone(Cする[ 1 ]); 20れる CNT [P] ++ ; 21である IF(strcmpの(B、C)== 0 ) 22である GOTO フラグに、 23である } 24 用(int型 I = 0 ; I <LEN - 1 ; ++ I){ 25 であれば(!Cを[I] = B [i])と{ 26 Flipone(C [I])。 27 Flipone(C [I + 1 ])。 28 もし(I + 2 < LEN){ 29 Flipone(C [I + 2 ])。 30 } 31 CNT [P] ++ ; 32 であれば(strcmpの(B、C)== 0 ) 33 ジャンプフラグ。 34 } 35 } 36 } 37 フラグ: 38 INT cnt_min = Getmin(CNT)。 39 であれば(strcmpの(B、C)== 0 ) 40 COUT << cnt_min << ENDL。 41 他の 42 coutの<< " 不可能" << てendl; 43 } 44 45 空隙 Flipone(チャー&S) 46 { 47 であれば(S == ' 0 ' ) 48個の S =の' 1" ; 49 他に 50 秒=の' 0 ' ; 51 } 52 53 INT Getmin(INT * CNT) 54 { 55 であれば(CNT [ 0 ]> CNT [ 1 ]) 56 リターン CNT [ 1 ]。 57 他に 58 のリターン CNT [ 0 ]; 59 }
*注:お勧めできませんgoto文