同じものを含む円順列の問題をJavaでプログラムを作って解いてみました。(^_^;
白玉6個、赤玉3個を円形に並べる方法
P.S.
問題がリンク切れしていたので、知恵袋から同じ問題を見つけてはり直しました。(^_^;
●CircularPerm01.java
/* * CircularPerm01.java * */ import java.util.Arrays; class CircularPerm01 { static boolean next_perm(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); } public static void main(String[] args) { final String P="白白白白白白赤赤赤"; final int N=P.length(); final int R=N; char[] p=P.toCharArray(); // 順列生成用 String s=""; long tm=System.nanoTime(); // Timer Start int count=0; Arrays.sort(p); // 念のためのソート do{ String t=new String(p); if(!s.contains(t)){ count++; System.out.println(t); s+=t+t+"|"; } }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); } }
●実行結果
白白白白白白赤赤赤 白白白白白赤白赤赤 白白白白白赤赤白赤 白白白白赤白白赤赤 白白白白赤白赤白赤 白白白白赤赤白白赤 白白白赤白白白赤赤 白白白赤白白赤白赤 白白白赤白赤白白赤 白白赤白白赤白白赤 計: 10 Runtime : 0.007 [sec]
※参考URL
●[PDF]同じものを含む円順列
- 作者: 東京出版編集部
- 出版社/メーカー: 東京出版
- 発売日: 2003/03/27
- メディア: 単行本
- 購入: 11人 クリック: 58回
- この商品を含むブログ (16件) を見る
離散数学「数え上げ理論」―「おみやげの配り方」から「Nクイーン問題」まで (ブルーバックス)
- 作者: 野崎昭弘
- 出版社/メーカー: 講談社
- 発売日: 2008/11/21
- メディア: 新書
- 購入: 14人 クリック: 104回
- この商品を含むブログ (33件) を見る
- 作者: 和田秀三
- 出版社/メーカー: サイエンス社
- 発売日: 1990/01/01
- メディア: 単行本
- 購入: 2人 クリック: 9回
- この商品を含むブログを見る