[プログラマ]柱と梁のpythonのインストール


ビーム取り付け
問題の説明
氷河が砕けるにつれて、雪城を漂流してきたジョルディは人生の第2幕のために住宅建築事業に身を投じることを決意した.ジョルディは柱と梁を利用して壁面構造を自動的に構築するロボットを開発する計画で、その前にロボットの動作をシミュレートするプログラムを作成していた.
このプログラムでは、2 D仮想壁面に柱と梁を使用して、柱とビューの長さが1のセグメントとして表されるフレーム構造をインストールできます.次のルールがあります.
柱は、底、梁の一端、または他の柱に配置する必要があります.
ビューの一端は柱にあるか、両端は別のビームと同時に接続する必要があります.
しかし、床とは壁の底の床のこと.
2 D壁面がn x nサイズの正射メッシュで、各メッシュサイズが1 x 1です.最初の壁面は空です.柱と梁は、グリッド線の交点ではなく、グリッドの各エッジに取り付けることができます.次に、柱と梁を取り付けてフレームを作成する例を示します.

たとえば、上図は次の手順で構造を作成します.
(1,0)から柱を上に取り付け、(1,1)から右にビームを作成します.
(2,1)から柱を上に取り付け、(2,2)から右にビームを作成します.
(5,0)から1本の柱を上に取り付け,(5,1)からもう1本の柱を上に取り付けます.
(4,2)からビームを右に取り付け,(3,2)からビームを右に取り付けます.
(4,2)右側のビームを最初に取り付けず,(3,2)右側のビームを取り付けてみると,2番ルールに合わないため取り付けられない.柱と梁を削除する機能もあり、柱と梁を削除した後、残りの柱と梁も上記のルールを満たすべきです.実行した操作が条件を満たしていない場合は、その操作は無視されます.
2 D配列build frameにパラメータが付与されている場合、壁面サイズn、柱、梁をインストールまたは削除する操作を含み、すべてのコマンドを実行した後に構造の状態に戻ります.
せいげんじょうけん
nは5以上100以下の自然数である.
build frameの垂直(行)長さは1000を超えない.
build frameの水平(列)長は4です.
build frameの要素は[x,y,a,b]である.
x,yは、柱、梁の交点を取り付けたり削除したりする座標であり、その形状は「水平座標、垂直座標」である.
aは取り付けまたは削除する構造のタイプを示し、0は柱、1は梁を表す.
bはインストールまたは削除する構造を表し、0は削除を表し、1はインストールを表す.
柱と梁が壁面から離れるように取り付けられていない場合.
床にビームを取り付ける場合はありません.
交差座標から構造の右側を表示し、柱を上から取り付けたり削除したりします.
インストールされた構造が重複している場合、または存在しない構造が削除されている場合は、入力は提供されません.
最終構築物の状態は以下の規則に従って戻ってください.
返される配列には、各構造の座標と、3つの水平(列)の長さを持つ2 D配列が含まれている必要があります.
返される配列の要素フォーマットは[x,y,a]です.
x、yは柱、梁の交点座標であり、「横座標、縦座標」形式である.
柱、ビューは、交点座標に対して右または上に取り付けられていることを示します.
aは構造のタイプを表し、0は柱を表し、1は梁を表す.
返される配列はx座標昇順に並べられ、x座標が同じ場合はy座標昇順に並べられます.
x、y座標が同じであれば、柱は梁の前に位置します.
最初は、コマンドのたびに環境をチェックしたり、構造をインストールしたり、取り外したりしましたが、コードが乱れていました.
従って,構造物を取り付けたり取り外したりして,構造物全体の状態を決定した後,不安定であれば,以前の動作をキャンセルするアルゴリズムを採用した.
基本アルゴリズムは以下の通りです.
if install or remove:
	install() or remove()
    if not stable():
    	rollback()
取り付けと取り外しが頻繁であるため、挿入と削除処理をO(1)O(1)O(1)O(1)O(1)O(1)O(1)O(1)O(1)O(1))にするために、構造の記憶構造をsetに設定した.
def stable(constructure):
    for x, y, crossbeam in constructure:
        if crossbeam:
            if (x, y-1, 0) in constructure or (x+1, y-1, 0) in constructure \
                or ((x-1, y, 1) in constructure and (x+1, y, 1) in constructure):
                continue
            else:
                return False
        else:
            if y == 0 or (x-1, y, 1) in constructure \
                or (x, y, 1) in constructure or (x, y-1, 0) in constructure:
                continue
            else:
                return False
    return True

def solution(n, build_frame):
    answer = set()
    for x, y, crossbeam, install in build_frame:
        if install:
            answer.add((x, y, crossbeam))
            if not stable(answer):
                answer.remove((x, y, crossbeam))
        else:
            answer.remove((x, y, crossbeam))
            if not stable(answer):
                answer.add((x, y, crossbeam))
    answer = list(map(list,answer))
    answer.sort()
    return answer