電子書籍の厳選無料作品が豊富!

Javaアルゴリズムで分からないことがあるので質問します。

a,b,c,d,e,f,g
これらの文字を各一回使ってできる文字列の、全てのパターンを一覧で表示したいのですが、なかなかうまくいきません。
出力結果は、下記のように全パターン出力するようなJavaプログラムなんですが。

↓出力結果↓
abcdefgh
abcdefhg
abcdehfg
・・・・・・・・
hgfedacb
hgfedcab
hgfedcba

※自分ではとりあえずここまでできています。
public class Test {
 public static void main(String[] args) {

 String[] pattern = {"a","b","c","d","e","f","g","h"};

  for(int i = 0; i <= pattern.length; i++){
   System.out.print(pattern[i]);

   if(i == pattern.length){
  System.out.println("");
   }

  }

 }
}


宜しくお願いします。

A 回答 (3件)

package pp;



public class perm0 {
static void print_perm(int[] perm){
for(int x: perm){
System.out.print(x + " ");
}
System.out.println();
}

static void make_perm(int n, int[] perm, boolean[] flag){
if(n == perm.length){
print_perm(perm);
} else {
for(int i = 1; i <= perm.length; i++){
if(flag[i]) continue;
perm[n] = i;
flag[i] = true;
make_perm(n + 1, perm, flag);
flag[i] = false;
}
}
}
//数
public static void main(String[] args){
make_perm(0, new int [8], new boolean [9]);
}
}
    • good
    • 0

効率とか考えずに総当りなアルゴリズムですけど


全桁分ループして、上位の桁で使用済みな文字だったらスキップ、
使用していない文字だったら連結して処理続行して、
一番内側のループで表示すればできそうじゃない?

※インデントを全角スペースにしています。
char[] ch = {'a', 'b', 'c'};
StringBuilder buf = new StringBuilder();

public static void main(String[] args) {
 // 基本的な考え方
 for(int loop1 = 0; ch.length; loop1++) {
  for(int loop2 = 0; ch.length; loop2++) {
   if (loop1 == loop2) continue;
   for(int loop3 = 0; ch.length; loop3++) {
    if (loop1 == loop3 || loop2 == loop3) continue;
    buf.setLength(0);
    buf.append(ch[loop1]).append(ch[loop2]).append(ch[loop3]);
    System.out.println(buf.toString());
   }
  }
 }

 // 再帰処理にしてみると
 f("");
}

public void f(String code) {
 if (code.length() == ch.length) {
  Systen.out.println(code);
 } else {
  for (int i=0; i<ch.length; i++) {
   if (-1 < code.indexOf(ch[i])) continue;
   buf.setLength(0);
   buf.append(code).append(ch[i]);
   f(buf.toString());
  }
 }
}

動作確認はしていないので、あしからず。
    • good
    • 0

http://ideone.com/WceLU

8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 = 40320個もあるので上記サイトでは最後まで表示しきってくれなかったが、
手元でテキストファイルにリダイレクトしてみたらちゃんと出力されているようだった。
    • good
    • 0
この回答へのお礼

ありがとうございます。自己解決しました。

お礼日時:2010/06/26 17:33

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!