質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

Q&A

解決済

1回答

1227閲覧

組み合わせの全列挙を求めるアルゴリズム

reina1125

総合スコア21

JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

0グッド

0クリップ

投稿2020/07/21 04:52

編集2020/08/03 07:48

組み合わせを1つ列挙することはできるのですが、2つ目以降の組み合わせの列挙の仕方がわかりません。
恐らくこのプログラムもあまりスマートではないと思うので、効率的な解き方があれば教えてください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

元のソースよくわからなかったので意図しない動作かもしれませんが
愚直に組み合わせをチェックしてみました。

チェック部分など
適当に変更したら、うまくいくかもしれません。

java

1static int ProjectA[][] = { { 1, 1, 0, 0 }, { 0, 1, 0, 0 }, { 0, 0, 0, 1 } }; 2static int ProjectB[][] = { { 1, 0, 1, 0 }, { 0, 0, 1, 0 }, { 1, 0, 0, 0 } }; 3static int ProjectC[][] = { { 1, 0, 0, 1 }, { 0, 0, 0, 1 }, { 0, 0, 1, 0 } }; 4 5/* 6 * int Project[][][]=new int[3][][]; 7 * Project[0]=Project1; 8 * Project[1]=Project2; 9 * Project[2]=Project3; 10 * 11 * 上記のコードは以下のように簡潔に書けるし、こちらの方がわかりやすいと思います。 12 */ 13static int[][][] ProjectALL = { 14 ProjectA, ProjectB, ProjectC 15}; 16 17public static void main(String[] args) { 18 for (int i = 0; i < 9; i++) { 19 for (int j = i + 1; j < 9; j++) { 20 for (int k = j + 1; k < 9; k++) { 21 if (check(getArray(i), getArray(j), getArray(k))) { 22 sysoutResult(i, j, k); 23 System.out.println("---------------"); 24 } 25 } 26 } 27 } 28} 29 30private static boolean check(int[] pj1, int[] pj2, int[] pj3) { 31 // 配列の中身の合計が{1,1,1,1}になるかチェックする 32 // 質問から読み取れなかったけど、pjは必ず3つを利用する前提 33 // ※ A[1], A[2],B[1], B[2]のような4つで成り立つケースは探せない) 34 return pj1[0] + pj2[0] + pj3[0] == 1 && 35 pj1[1] + pj2[1] + pj3[1] == 1 && 36 pj1[2] + pj2[2] + pj3[2] == 1 && 37 pj1[3] + pj2[3] + pj3[3] == 1; 38} 39 40private static int[] getArray(int num) { 41 /* 42 * ProjectALL 配列は 43 * { 0, 1, 2, // ProjectA[0] ,ProjectA[1] ,ProjectA[2] 44 * 3, 4, 5, // ProjectB[0] ,ProjectB[1] ,ProjectB[2] 45 * 6, 7, 8} // ProjectC[0] ,ProjectC[1] ,ProjectC[2] 46 * 47 * という位置関係で一次元配列に格納したように扱える。 48 * 0~8の値を3で割った答え(余り切り捨て)と、3で割った余りで、一意に配列を選択できる 49 */ 50 51 return ProjectALL[num / 3][num % 3]; 52} 53 54private static void sysoutResult(int pj1, int pj2, int pj3) { 55 String[] companies = { "A社", "B社", "C社" }; 56 57 // 元のソースに合わせて2重ループで表示 58 for (int i = 0; i < 3; i++) { 59 for (int j = 0; j < 3; j++) { 60 int pjNum = i * 3 + j; // 配列の位置をpjNumに変換(考え方は、getArrayにて説明) 61 boolean ret = (pjNum == pj1 || pjNum == pj2 || pjNum == pj3); 62 System.out.println(companies[i] + "の" + (j + 1) + "位のプロジェクト=" + (ret ? "1" : "0")); 63 } 64 } 65 66 // 修正前 67 // for(int i = 0; i < 9; i++) { 68 // boolean ret = (i == pj1 || i == pj2 || i == pj3); 69 // System.out.println(companies[i / 3] + "の" + (i % 3 + 1) + "位のプロジェクト=" + (ret ? "1" : "0")); 70 //} 71} 72

投稿2020/07/21 10:44

編集2020/07/22 08:42
momon-ga

総合スコア4826

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

reina1125

2020/07/21 11:16

ありがとうございます!! 本当に無知で申し訳ないのですが、最後の行の (ret ? "1" : "0")がどのような意味か教えていただけないでしょうか?
momon-ga

2020/07/21 12:32

三項演算子というやつです。 ”A社の1位のプロジェクト=”の最後を1か0かで表示します。
reina1125

2020/07/21 15:09

ありがとうございます!!(^^)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問