は~い...その通り!サイコロが複数パターンです、どうもボクです。
最近、思うんですよね...こんなこといくらやってても無駄なんじゃないかと...
だが、しかし!
学ぶって言うのはまねぶって言うじゃん?みんな最初は誰かの真似、おんなしおんなし。
「SHIROBAKO」名言 発言キャラ:井口 祐未
私の一言:まずはできる人からいい部分を真似していけばいい。「まねぶ」だよ!
⇧ アニメのセリフって、確かに励まされる言葉が多いですね。アニメぜんぜん見てないけど...
というわけで、今回で一先ずはサイコロについては、一旦は完了ということで。
そんでは、レッツトライ~ 。
サイコロは同じか
まぁ、前と同じく、サイコロが同じかどうかを判定するやつなんですが、今回は、サイコロの数が「2 ≤ n ≤ 100」ってことみたい...
Eclipseを起動し、適当なJavaプロジェクト、クラスを作成で。
ソースコードはこんな感じで。
Dice.java
package dto; public class Dice { private int number[]; private int work[]; public Dice() { } public Dice(String[] args) { number = new int[args.length]; work = new int[args.length]; // サイコロの初期化 for (int i = 0; i < args.length; i++) { number[i] = Integer.parseInt(args[i]); } } public void rollDice(char action, int num) { for (int i = 0; i < num; i++) { this.work[i] = this.number[i]; } switch (action) { case 'E': // West→Top, South→South, Top→East, Bottm→West, North→North, East→Bottom setNumber(work[3], work[1], work[0], work[5], work[4], work[2]); break; case 'N': // South→Top, Bottom→South, East→East, West→West, Top→Nouth, Nouth→Bottom setNumber(work[1], work[5], work[2], work[3], work[0], work[4]); break; case 'S': // North→Top, Top→South, East→East, West→West, Bottom→North, South→Bottom setNumber(work[4], work[0], work[2], work[3], work[5], work[1]); break; case 'W': // East→Top, South→South, Bottom→East, Top→West, North→North, West→Bottom setNumber(work[2], work[1], work[5], work[0], work[4], work[3]); break; default : break; } } public void setNumber(int n1, int n2, int n3, int n4, int n5, int n6) { this.number[0] = n1; this.number[1] = n2; this.number[2] = n3; this.number[3] = n4; this.number[4] = n5; this.number[5] = n6; } public int[] getNumber () { return this.number; } public int takeTopNumber() { return this.number[0]; } public int takeSouthNumber() { return this.number[1]; } public int takeEastNumber() { return this.number[2]; } public boolean equals(Object obj, char[] order) { if (obj == this) { return true; } if (obj == null) { return false; } if (!(obj instanceof Dice)) { return false; } Dice another = (Dice)obj; boolean isSame = false; for (int i = 0; i < order.length; i++) { this.rollDice(order[i], another.getNumber().length); for (int j = 0; j < another.getNumber().length; j++) { if (this.number[j] == another.number[j]) { isSame = true; } else { isSame = false; break; } } if (isSame) { break; } } return isSame; } }
TestDice04.java
package main; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; import dto.Dice; public class TestDice04 { public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); List<Dice> diceList = new ArrayList<>(); int isSameCount = 0; try { String order = "NNNNWNNNWNNNENNNENNNWNNN"; char[] orderChar = order.toCharArray(); int n = Integer.parseInt(br.readLine()); for (int i = 0; i < n; i++) { diceList.add(new Dice(br.readLine().split("\\s"))); } for (int i = 0; i < diceList.size(); i++) { for (int j = i+1; j < diceList.size(); j++) { if (diceList.get(i).equals(diceList.get(j), orderChar)) { isSameCount++; } } } if(isSameCount == 0) { System.out.println("Yes"); } else { System.out.println("No"); } } catch (NumberFormatException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } catch (IOException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } } }
んで、実行。
入力値は、
Input
1行目にサイコロの個数 が与えられます。続く 行に各サイコロの面の整数が与えられます。
各サイコロについて各面の整数が、ラベルの順番に空白区切りで1行に与えられます。
ということで、入力。
もう一度、実行して、最初とは違うパターンで入力。
できました~。
まぁ、なんていうか、n = 100 の時とかの場合、インスタンスを100個生成しちゃうことになるので、もっと良いアルゴリズムを考えんといかん気はするけど...(哀)。
今回はこのへんで。