Lv 3柱とビームの取り付け
5057 ワード
質問する
氷河が砕けるにつれて、雪城に漂ってきた「ジョルディ」は人生の第2幕のため、住宅建築事業に身を投じることを決意した.「ジョルディ」は柱と梁を利用して壁面構造を自動的に構築するロボットを開発する計画で、これまでロボットの動作をシミュレートするプログラムを作成していた.
このプログラムでは、2 D仮想壁面に柱と梁を使用して、柱とビューの長さが1のセグメントとして表されるフレーム構造をインストールできます.次のルールがあります.
2 D壁面がn x nサイズの正射メッシュで、各メッシュサイズが1 x 1です.最初の壁面は空です.柱と梁は、グリッド線の交点ではなく、グリッドの各エッジに取り付けることができます.次に、柱と梁を取り付けてフレームを作成する例を示します.
たとえば、上図は次の手順で構造を作成します.
2 D配列build frameにパラメータが付与されている場合、壁面サイズn、柱、梁をインストールまたは削除する操作を含み、すべてのコマンドを実行した後に構造の状態に戻ります.
せいげんじょうけん
nは5以上100以下の自然数である.
build frameの垂直(行)長さは1000を超えない.
build frameの水平(列)長は4です.
build frameの要素は[x,y,a,b]である.
床にビームを取り付ける場合はありません.
交差座標から構造の右側を表示し、柱を上から取り付けたり削除したりします.
インストールされた構造が重複している場合、または存在しない構造が削除されている場合は、入力は提供されません.
最終構築物の状態は以下の規則に従って戻ってください.
nbuild_frameresult5[[1,0,0,1],[1,1,1,1],[2,1,0,1],[2,2,1,1],[5,0,0,1],[5,1,0,1],[4,2,1,1],[3,2,1,1]][[1,0,0],[1,1,1],[2,1,0],[2,2,1],[3,2,1],[4,2,1],[5,0,0],[5,1,0]]5[[0,0,0,1],[2,0,0,1],[4,0,0,1],[0,1,1,1],[1,1,1,1],[2,1,1,1],[3,1,1,1],[2,0,0,0],[1,1,1,0],[2,2,0,1]][[0,0,0],[0,1,1],[1,1,1],[2,1,1],[3,1,1],[4,0,0]]
I/O例説明
I/O例#1
問題の例.
I/O例#2
8番目のタスクを実行すると、次の構造が作成されます.
9番目の操作では、(1,1)から右側のビームを削除すると、右側の表示条件が満たされないため(2,1)は無視されます.
10番目の操作では、(2,2)内の上向きの柱は条件を満たさないため、無視されます.
に答える
条件を満たす実施問題
コード#コード#
def solution(n, build_frame):
mat = [[[0]*2 for _ in range(n+1)] for _ in range(n+1)]
answer = []
for b in build_frame:
r = b[0]
c = b[1]
if b[3]:
if b[2]:
if check_beam(n,b[0],b[1],mat):
answer.append([b[0],b[1],1])
mat[b[0]][b[1]][1] = 1
else:
if check_column(n,b[0],b[1],mat):
answer.append([b[0],b[1],0])
mat[b[0]][b[1]][0] = 1
else:
if b[2]:
mat[r][c][1] = 0
if r < n and mat[r+1][c][0] == 1:
if not check_column(n,r+1,c,mat):
mat[r][c][1] = 1
continue
if r < n and mat[r+1][c][1] == 1:
if not check_beam(n,r+1,c,mat):
mat[r][c][1] = 1
continue
if mat[r][c][0] == 1:
if not check_column(n,r,c,mat):
mat[r][c][1] = 1
continue
if r > 0 and mat[r-1][c][1] == 1:
if not check_beam(n,r-1,c,mat):
mat[r][c][1] = 1
continue
answer.remove([r,c,1])
else:
mat[r][c][0] = 0
if c < n and mat[r][c+1][0] == 1:
if not check_column(n,r,c+1,mat):
mat[r][c][0] = 1
continue
if c < n and mat[r][c+1][1] == 1:
if not check_beam(n,r,c+1,mat):
mat[r][c][0] = 1
continue
if r > 0 and c < n and mat[r-1][c+1][1] == 1:
if not check_beam(n,r-1,c+1,mat):
mat[r][c][0] = 1
continue
answer.remove([r,c,0])
return sorted(answer, key=lambda x: (x[0],x[1],x[2]))
def check_column(n,r,c,mat):
if c == 0:
return True
if r > 0 and mat[r-1][c][1] == 1:
return True
if mat[r][c][1] == 1:
return True
if c > 0 and mat[r][c-1][0] == 1:
return True
def check_beam(n,r,c,mat):
if c > 0 and mat[r][c-1][0] == 1:
return True
if r < n and c > 0 and mat[r+1][c-1][0] == 1:
return True
if r > 0 and mat[r-1][c][1] == 1 and r < n and mat[r+1][c][1] == 1:
return True
Reference
この問題について(Lv 3柱とビームの取り付け), 我々は、より多くの情報をここで見つけました https://velog.io/@du-du-zi/Lv3-기둥과-보-설치テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol