もう一問、判断推理の順序関係の問題をJavaで解いてみました。(^_^;
解が一通りに確定しないので、前回の問題よりちょっと難しいです。選択肢のチェックで、「&=」を使っているのは、解が一通りに確定しない場合の対策です。
A〜Hの8人がマラソンをした結果、次のようになったことがわかっている。
一、AとHの間に2人ゴールインしている。
ニ、CはBおよびEどちらよりも先にゴールインした。
三、Gは3位以内で、AとFは共に4位以下であった。
四、BはDよりも早くゴールインした。
五、Gの直後にAがゴールインし、Hの直前にFがゴールインした。
以上のことから確実にいえることはどれか。
1.Dは5位でEは8位である
2.Gは2位でFは5位である
3.Cは1位でHは7位である
4.Bは2位でDは7位である
5.Aは4位でHは8位である
●Rank02.java
/* * Rank02.java * */ class Rank02 { static final String RUNNER="ABCDEFGH"; static void swap(char[] s, int i, int j) { char t = s[i]; s[i] = s[j]; s[j] = t; } static boolean next_perm(char[] p, int n, int r) { int i, j, k; 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--) 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--); swap(p,j,i-1); for(k = 0; k <= (n-i-1)/2; k++) swap(p,i+k,n-k-1); return(true); } // xがa[]の何番目にあるか調べるメソッド static int getPos(char[] a, char x) { for(int i=0; i<a.length; i++) if(a[i]==x) return(i); // あるときは、0〜a.length-1を返す. return(-1); // ないときは、-1を返す. } public static void main(String[] args) { char[] r=RUNNER.toCharArray(); boolean[] c={true,true,true,true,true}; long tm=System.nanoTime(); // Timer Start do{ //if(!()) continue; // 条件 if(Math.abs( getPos(r,'A')-getPos(r,'H') )!=3) continue; // 条件1 if(!(getPos(r,'C')< getPos(r,'B'))) continue; // 条件2 if(!(getPos(r,'C')< getPos(r,'E'))) continue; // 条件2 if(!(getPos(r,'G')+1<=3)) continue; // 条件3 if(!(getPos(r,'A')+1>=4)) continue; // 条件3 if(!(getPos(r,'A')+1>=4)) continue; // 条件3 if(!(getPos(r,'B')< getPos(r,'D'))) continue; // 条件4 if(!(getPos(r,'G')+1==getPos(r,'A'))) continue; // 条件5 if(!(getPos(r,'H')-1==getPos(r,'F'))) continue; // 条件5 // チェックを潜り抜けたものだけを表示 System.out.println("#: 12345678"); System.out.println("R: "+new String(r)); System.out.println(); // 選択肢のチェック if(getPos(r,'D')+1==5 && getPos(r,'E')+1==8) c[0]&=true; else c[0]&=false; if(getPos(r,'G')+1==2 && getPos(r,'F')+1==5) c[1]&=true; else c[1]&=false; if(getPos(r,'C')+1==1 && getPos(r,'H')+1==7) c[2]&=true; else c[2]&=false; if(getPos(r,'B')+1==2 && getPos(r,'D')+1==7) c[3]&=true; else c[3]&=false; if(getPos(r,'A')+1==4 && getPos(r,'H')+1==8) c[4]&=true; else c[4]&=false; }while(next_perm(r,8,8)); System.out.print("∴"); for(int i=0; i< 5; i++) if(c[i]) System.out.println(" "+(i+1)); tm=System.nanoTime()-tm; // Timer Stop System.out.printf("Runtime : %.3f [sec]\n",(double)tm/1e9); } }
●実行結果
#: 12345678 R: CBGADFHE #: 12345678 R: CBGAEFHD #: 12345678 R: CEGABFHD ∴ 3 Runtime : 0.015 [sec]
数的推理 光速の解法テクニック―公務員試験 (公務員基本書シリーズ)
- 作者: 鈴木清士
- 出版社/メーカー: 実務教育出版
- 発売日: 1996/09/01
- メディア: 単行本
- この商品を含むブログ (6件) を見る
- 作者: 資格試験研究会
- 出版社/メーカー: 実務教育出版
- 発売日: 2009/01/23
- メディア: 単行本(ソフトカバー)
- 購入: 5人 クリック: 9回
- この商品を含むブログ (7件) を見る