知恵袋で見つけた判断推理の長距離走の問題をJavaで解いてみました。この問題は、順序関係と対応関係の融合問題のようです。(^_^;
問題A〜Eの選手がそれぞれ赤、青、黄、緑、黒の異なる色のゼッケンを着け、長距離走を行った。
次のことがわかっているとき、確実にいえるのはどれか。
(a) 青のゼッケンの選手がゴールした後、一人おいてから、Aがゴールした
(b) Bは赤のゼッケンの選手よりも先にゴールした
(c) CはEよりもさきにゴールした
(d) Dがゴールした後三人おいてから緑のゼッケンの選手がゴールした
(e) 黒のゼッケンの選手は4番目にゴールした
1、最初にゴールした選手は青のゼッケンをきていた
2、Aは4番目にゴールした
3、黄色のゼッケンの選手の次に赤のゼッケンの選手がゴールした
4、Cは黒のゼッケンの選手よりもさきにゴールした
5、Eは緑のゼッケンをつけていた
ただし、条件に(a)〜(e)と名前をつけました。
● MarathonRunning1.java
/* * MarathonRunning1.java * */ import java.util.Arrays; class MarathonRunning1 { // 順列生成 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); } // 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) { final String RUNNER="ABCDE"; final String COLOR ="赤青黄緑黒"; char[] r = RUNNER.toCharArray(); char[] c = COLOR .toCharArray(); boolean[] ch = {true,true,true,true,true}; long tm=System.nanoTime(); // Timer Start Arrays.sort(c); do{ //--- c loop ---// if(!(getPos(c,'黒')+1==4)) continue; // 条件(e) r = RUNNER.toCharArray(); do{ //--- r loop ---// if(!(getPos(c,'青')+2==getPos(r,'A'))) continue; // 条件(a) if(!(getPos(r,'B') < getPos(c,'赤'))) continue; // 条件(b) if(!(getPos(r,'C') < getPos(r,'E'))) continue; // 条件(c) if(!(getPos(r,'D')+4==getPos(c,'緑'))) continue; // 条件(d) // チェックを潜り抜けたものだけを表示 System.out.println("#: 12345"); System.out.println("R: "+new String(r)); System.out.println("C: "+new String(c)); System.out.println(); // 選択肢のチェック if(getPos(c,'青')+1==1) ch[0]&=true; else ch[0]&=false; if(getPos(r,'A')+1==4) ch[1]&=true; else ch[1]&=false; if(getPos(c,'黄')+1==getPos(c,'赤')) ch[2]&=true; else ch[2]&=false; if(getPos(r,'C')< getPos(c,'黒')) ch[3]&=true; else ch[3]&=false; if(getPos(r,'E')==getPos(c,'緑')) ch[4]&=true; else ch[4]&=false; }while(nextPerm(r,5,5)); }while(nextPerm(c,5,5)); System.out.print("∴"); for(int i=0; i< 5; i++) if(ch[i]) System.out.println(" "+(i+1)); tm=System.nanoTime()-tm; // Timer Stop System.out.printf("Runtime : %.3f [sec]\n",(double)tm/1e9); } }
●実行結果
#: 12345 R: DBACE C: 青黄赤黒緑 #: 12345 R: DBCAE C: 黄青赤黒緑 ∴ 5 Runtime : 0.003 [sec]
EFFECTIVE JAVA 第2版 (The Java Series)
- 作者: Joshua Bloch,柴田芳樹
- 出版社/メーカー: 丸善出版
- 発売日: 2014/03/11
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (12件) を見る
パーフェクトJava (PERFECT SERIES) (PERFECT SERIES 2)
- 作者: アリエル・ネットワーク株式会社,井上誠一郎,永井雅人,松山智大
- 出版社/メーカー: 技術評論社
- 発売日: 2009/09/24
- メディア: 大型本
- 購入: 26人 クリック: 360回
- この商品を含むブログ (35件) を見る