知恵袋で見つけた判断推理のリーグ戦の問題をJavaで解いてみました。
今回は選択肢のチェックは省略しました。(^_^;
● LeagueMatch1.java
/* * LeagueMatch1.java * * □abcdef(相手) * A\×□□○□ 1勝2敗2分 * B○\□□□□ * C□□\□□○ 1勝のみ * D□□□\□○ 3勝2敗 * E×□□□\□ 2勝3敗 * F□□××□\ 1勝3敗1分 */ import java.util.Arrays; class LeagueMatch1 { // 順列生成 static boolean nextPerm(char[] p, int n, int r) { int i, j; char t; if(r <= 0 || n < r) return(false); for(i = r + 1; i <= n-1; i++) for(j = i; j >= r + 1 && p[j-1] < p[j]; j--){ t = p[j]; p[j] = p[j-1]; p[j-1] = t; // swap(p,j,j-1); } for(i = n - 1; i > 0 && p[i-1] >= p[i]; i--); if(i==0) return(false); for(j = n - 1; j > i && p[i-1] >= p[j]; j--); t = p[j]; p[j] = p[i-1]; p[i-1] = t; // swap(p,j,i-1); for(j = n - 1; i < j; i++, j--){ t = p[i]; p[i] = p[j]; p[j] = t; // swap(p,i,j); } return(true); } static String sSort(String s) { char[] c=s.toCharArray(); Arrays.sort(c); return(new String(c)); } // 反対称な文字を求める static char revChar(char c) { if (c=='○') c='×'; else if (c=='×') c='○'; return(c); // ○×以外は元の文字を返す } static boolean nextRepPerm(int[] p, int n, int r) { int cy=1; for(int i=r-1; i>=0; i--) { p[i]+=cy; if(p[i]>=n){ p[i]=0; cy=1; } else cy=0; } if(cy==0) return(true); return(false); } public static void main(String[] args) { final String A = sSort("○××△△\"); final String B = "○\□□□□"; final String C = "□□\□□○"; final String D = sSort("○○○××\"); final String E = sSort("○○×××\"); final String F = sSort("○×××△\"); char[] a = A.toCharArray(); char[] b = B.toCharArray(); char[] c = C.toCharArray(); char[] d = D.toCharArray(); char[] e = E.toCharArray(); char[] f = F.toCharArray(); int [] r = new int[4]; // nextRepPerm用の初期値 int iCount = 0; long tm=System.nanoTime(); // Timer Start a = A.toCharArray(); do{ //--- a loop ---// if(a[0]!='\') continue; if(a[1]!='×') continue; d = D.toCharArray(); do{ //--- d loop ---// if(d[3]!='\') continue; e = E.toCharArray(); do{ //--- e loop ---// if(e[4]!='\') continue; if(e[0]!='×') continue; f = F.toCharArray(); do{ //--- f loop ---// if(f[5]!='\') continue; if(f[2]!='×') continue; if(f[3]!='×') continue; for(int i=0; i< 4; i++) r[i]=0; do{ //--- c loop ---// c[0] = (r[0]==0 ? '×' : '△'); c[1] = (r[1]==0 ? '×' : '△'); // c[2] = '\'; c[3] = (r[2]==0 ? '×' : '△'); c[4] = (r[3]==0 ? '×' : '△'); // c[5] = '○'; // 対角線に関する反対称性をチェック if(a[2]!=revChar(c[0])) continue; if(a[3]!=revChar(d[0])) continue; if(a[4]!=revChar(e[0])) continue; if(a[5]!=revChar(f[0])) continue; if(c[3]!=revChar(d[2])) continue; if(c[4]!=revChar(e[2])) continue; if(c[5]!=revChar(f[2])) continue; if(d[4]!=revChar(e[3])) continue; if(d[5]!=revChar(f[3])) continue; if(e[5]!=revChar(f[4])) continue; // 対角線に関する反対称性からbを求める b[0]=revChar(a[1]); ; b[2]=revChar(c[1]); b[3]=revChar(d[1]); b[4]=revChar(e[1]); b[5]=revChar(f[1]); // チェックをくぐり抜けたものだけを表示 iCount++; System.out.println("["+iCount+"]"); System.out.println("□abcdef"); System.out.println("A" + new String(a)); System.out.println("B" + new String(b)); System.out.println("C" + new String(c)); System.out.println("D" + new String(d)); System.out.println("E" + new String(e)); System.out.println("F" + new String(f)); System.out.println(); }while(nextRepPerm(r,2,4)); }while(nextPerm(f,6,6)); }while(nextPerm(e,6,6)); }while(nextPerm(d,6,6)); }while(nextPerm(a,6,6)); tm=System.nanoTime()-tm; // Timer Stop System.out.printf("Runtime : %.3f [sec]\n",(double)tm/1e9); } }
●実行結果
[1] □abcdef A\×△×○△ B○\○○○○ C△×\××○ D○×○\×○ E××○○\× F△×××○\ [2] □abcdef A\×△×○△ B○\△○○○ C△△\××○ D○×○\×○ E××○○\× F△×××○\ Runtime : 0.019 [sec]
※参考URL
●知恵袋で見つけた判断推理のリーグ戦の問題をPythonで解いてみた。
●知恵袋で見つけた判断推理のリーグ戦の問題をPythonで解いてみた。(2)