同じものを含む順列の問題をJavaでプログラムを作って解いてみました。(^_^;
YOKOHOMAの8文字(AとOが2つ,YKHMが1つ)を横1列に並べての順列を考える問題です。
ただし,AOという並び,または,OAという並びの少なくとも一方を含むことです。
●PermSame01.java
/* * PermSame01.java * */ import java.util.Arrays; class PermSame01 { 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); } static String sSort(String s) { char[] c=s.toCharArray(); Arrays.sort(c); return(new String(c)); } public static void main(String[] args) { final String P=sSort("YOKOHAMA"); final int N=P.length(); final int R=N; char[] p=P.toCharArray(); // 順列生成用 long tm=System.nanoTime(); // Timer Start int count=0; do{ String s=new String(p); if(s.contains("AO") || s.contains("OA")) count++; }while(next_perm(p,N,R)); System.out.println("計: "+count); tm=System.nanoTime()-tm; // Timer Stop System.out.printf("Runtime : %.3f [sec]\n",(double)tm/1e9); } }
●実行結果
計: 7440 Runtime : 0.007 [sec]
- 作者: 安田亨
- 出版社/メーカー: 東京出版
- 発売日: 2014/08/15
- メディア: 単行本
- 購入: 6人 クリック: 42回
- この商品を含むブログ (16件) を見る
日本一わかりやすい 坂田アキラの 確率が面白いほどとける本 (坂田アキラの理系シリーズ)
- 作者: 坂田アキラ
- 出版社/メーカー: 中経出版
- 発売日: 2011/09/14
- メディア: 単行本(ソフトカバー)
- 購入: 1人 クリック: 7回
- この商品を含むブログを見る
細野真宏の確率が本当によくわかる本 (細野真宏の数学が よくわかる本)
- 作者: 細野真宏
- 出版社/メーカー: 小学館
- 発売日: 2003/08/25
- メディア: 単行本
- 購入: 3人 クリック: 131回
- この商品を含むブログ (14件) を見る