特別なロックを列挙

この問題は、合格率は100%、SSFD ......と、このスラグため、または精神遅滞とWAのでした......

タイトル

説明
N組成(N <30)で接続された特殊なバイナリコンビネーションロックボタンがあり、ボタンは凹/凸状の2つの状態があり、ハンドボタンによって、その状態を変化させます。

しかし、頭痛は、ボタンを押したときにときに、2つのボタンの状態は、逆にも隣接していると言っているということです。もちろん、あなたは左のみボタンのことわざに隣接影響する最も一番右のボタンを押す場合。

現在のロック状態は、問題を解決する必要があり、知られているあなたは所望の目標状態にロックするために、少なくとも何回ボタンに応じて必要があります。

入力
0は、凹面、凸面表しを表し、現在の/目標のロック状態を表し、1と0の二つの他の長い文字列によって与えられる2本のライン。
出力は
、少なくとも変更は出力が不可能、達成できない場合は、操作の数のボタンを押す必要があります。
サンプル入力
011
000
サンプル出力
1

分析

この質問は、実際には、バリアントは問題を点灯が、吸盤の初め、各状態の直接の列挙は(順不同ライトの場合と考える)、30日の電力に注意を払っていないが、30,2の最大の天文nがあり、非常に簡単ですああ、収穫TLEそう。
実際には、スイッチの第1の状態にのみ列挙子。スイッチの各々を決定した後、凹凸に対応するスイッチは、スイッチの背面、スイッチの背面が決定されること、すなわち状態によって決まります。最後に、最後のスイッチか、二つの状態であれば第一スイッチ、そして最後のスイッチは、出力不可能なターゲットと同じではありません。のみ4MS。

ACコード

#include <iostream>
#include <bitset>
#include <cstring>
#include <algorithm>
using namespace std;
bitset <30> initt;
bitset <30> goal;
int main() {
	char s[31], e[31];
	cin.getline(s,30);
	cin.getline(e,30);
	int lens = strlen(s);
	for (int i = 0; i < lens; ++i) {
		if (s[i] == '1') initt[i] = 1;
		else initt[i] = 0;
		if (e[i] == '1') goal[i] = 1;
		else goal[i] = 0;
	}
	bitset <30> sw;
	int minop = 31;
	for (int x = 0; x <= 1; ++x) {
		bitset <30> init = initt;
		sw[0] = x;
		if (sw[0]) {
			init.flip(0);
			init.flip(1);
		}
		for (int i = 1; i < lens; ++i) {
			if (init[i-1] == goal[i-1]) sw[i] = 0;
			else {
				sw[i] = 1;
				init.flip(i-1);
				init.flip(i);
				if (i < lens - 1) init.flip(i+1);
			}
		}
		if (init[lens-1] == goal[lens-1]) {
			if (minop > sw.count()) minop = sw.count();
		}
	}
	if (minop == 31) cout << "impossible" << endl;
	else cout << minop << endl;
	return 0;
}

それはほとんどのテンプレートの質問です。

おすすめ

転載: blog.csdn.net/weixin_44288817/article/details/90108697