組み合わせを1つ列挙することはできるのですが、2つ目以降の組み合わせの列挙の仕方がわかりません。
恐らくこのプログラムもあまりスマートではないと思うので、効率的な解き方があれば教えてください。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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総合スコア4826
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/21 11:16
2020/07/21 12:32
2020/07/21 15:09