実施-6.ビーム取り付け
44113 ワード
質問する
氷河が砕けるにつれて、雪城に漂ってきた「ジョルディ」は人生の第2幕のため、住宅建築事業に身を投じることを決意した.「ジョルディ」は柱と梁を利用して壁面構造を自動的に構築するロボットを開発する計画で、これまでロボットの動作をシミュレートするプログラムを作成していた.
このプログラムでは、2 D仮想壁面に柱と梁を使用して、柱とビューの長さが1のセグメントとして表されるフレーム構造をインストールできます.次のルールがあります.
しかし、床とは壁の底の床のこと.
たとえば、上図は次の手順で構造を作成します.
2 D配列build frameにパラメータが付与されている場合、壁面サイズn、柱、梁をインストールまたは削除する操作を含み、すべてのコマンドを実行した後に構造の状態に戻ります.
せいげんじょうけん
I/O例説明
I/O例#1
問題の例.
I/O例#2
8番目のタスクを実行すると、次の構造が作成されます.
9番目の操作では、(1,1)から右側のビームを削除すると、右側の表示条件が満たされないため(2,1)は無視されます.
10番目の操作では、(2,2)内の上向きの柱は条件を満たさないため、無視されます.
インプリメンテーションコード
import java.util.*;
class Node implements Comparable<Node>{
private int x;
private int y;
private int a;
public Node(int x, int y, int a) {
this.x = x;
this.y = y;
this.a = a;
}
public int getX(){
return x;
}
public int getY(){
return y;
}
public int getA(){
return a;
}
@Override
public int compareTo(Node other) {
if(this.x == other.x && this.y == other.y ) {
return Integer.compare(this.a, other.a);
}
else if(this.x == other.x) {
return Integer.compare(this.y, other.y);
}
return Integer.compare(this.x, other.x);
}
}
class Solution {
public boolean check(ArrayList<ArrayList<Integer>>answer){
for(int i = 0; i < answer.size(); i++){
int x = answer.get(i).get(0);
int y = answer.get(i).get(1);
int a = answer.get(i).get(2);
// 기둥
if(a == 0){
boolean ck = false;
// 바닥
if(y == 0) ck = true;
else{
for(int j = 0; j < answer.size(); j++){
// 기둥위
if(x == answer.get(j).get(0) && y-1 == answer.get(j).get(1) && answer.get(j).get(2) == 0){
ck = true;
}
// 보 오른쪽
else if(x-1 == answer.get(j).get(0) && y == answer.get(j).get(1) && answer.get(j).get(2) == 1){
ck = true;
}
// 보 왼쪽
else if(x == answer.get(j).get(0) && y == answer.get(j).get(1) && answer.get(j).get(2) == 1){
ck = true;
}
}
if(!ck) return false;
}
}
// 보
else if(a == 1){
boolean ck = false;
boolean left = false;
boolean rigth = false;
for(int j = 0; j <answer.size() ; j++){
//기둥위 왼쪽
if(x == answer.get(j).get(0) && y-1 == answer.get(j).get(1) && answer.get(j).get(2) == 0){
ck = true;
}
//기둥위 오른쪽
else if(x+1 == answer.get(j).get(0) && y-1 == answer.get(j).get(1) && answer.get(j).get(2) == 0){
ck = true;
}
//보 왼쪽
if(x-1 == answer.get(j).get(0) && y == answer.get(j).get(1) && answer.get(j).get(2) == 1){
left = true;
}
//보 오른쪽
if(x+1 == answer.get(j).get(0) && y == answer.get(j).get(1) && answer.get(j).get(2) == 1){
rigth = true;
}
}
if(rigth && left) ck =true;
if(!ck) return false;
}
}
return true;
}
public int[][] solution(int n, int[][] build_frame) {
ArrayList<ArrayList<Integer>>answer = new ArrayList<>();
for(int i = 0;i <build_frame.length; i++){
int x = build_frame[i][0];
int y = build_frame[i][1];
int a = build_frame[i][2];
int b = build_frame[i][3];
if(b == 0){
for(int j = 0; j < answer.size();j++){
if(x == answer.get(j).get(0) && y == answer.get(j).get(1) && a == answer.get(j).get(2)){
ArrayList<Integer>del = answer.get(j);
answer.remove(j);
if(!check(answer)){
answer.add(del);
}
}
}
}
if(b == 1){
ArrayList<Integer>insert = new ArrayList<>();
insert.add(x);
insert.add(y);
insert.add(a);
answer.add(insert);
if(!check(answer)){
answer.remove(answer.size()-1);
}
}
}
ArrayList<Node>list = new ArrayList<>();
for(int i = 0; i < answer.size(); i++){
list.add(new Node(answer.get(i).get(0), answer.get(i).get(1), answer.get(i).get(2)));
}
Collections.sort(list);
int[][] result = new int[list.size()][3];
for(int i = 0; i < list.size(); i ++){
result[i][0] = list.get(i).getX();
result[i][1] = list.get(i).getY();
result[i][2] = list.get(i).getA();
}
return result;
}
}
コード解釈
これは典型的な実施問題であり,シミュレーション問題である.この問題を解くときは順番にやるのは難しい.1つ目のポイントは配列値をArrayListで比較することです建設するか削除するかによって区別する.値bが0(削除)の場合、bが1(建設)の場合、分割することができる.
また、削除・建設のため、削除・建設後に条件を満たしているかを確認する.したがって、操作を続行し、条件が満たされていることを確認し、条件が満たされていない場合は元の状態に戻すことができます.
条件をチェックすると、ArrayListの値が完全にナビゲートされて確認され、柱の場合と表示された場合、それぞれ確認されます.
最後に、条件が配列を返す場合はx座標昇順、x座標が同じ場合はy座標昇順で並べ替える必要があります.したがって、Compabiledインタフェースを継承すると、比較方法が上書きされます.
Reference
この問題について(実施-6.ビーム取り付け), 我々は、より多くの情報をここで見つけました https://velog.io/@cse05091/구현-6.-기둥과-보-설치テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol