• 締切済み

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

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("");    }   }  } } 宜しくお願いします。

  • Java
  • 回答数3
  • ありがとう数16

みんなの回答

回答No.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]); } }

  • Lieserl
  • ベストアンサー率81% (31/38)
回答No.2

効率とか考えずに総当りなアルゴリズムですけど 全桁分ループして、上位の桁で使用済みな文字だったらスキップ、 使用していない文字だったら連結して処理続行して、 一番内側のループで表示すればできそうじゃない? ※インデントを全角スペースにしています。 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());   }  } } 動作確認はしていないので、あしからず。

回答No.1

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

kikupuri
質問者

お礼

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

関連するQ&A

  • Javaで配列の長さを知るメソッド

    Javaの配列の長さを知るメソッドを調べています。 例えば String sTest[][] = new String[2][2]; sTest[0][0] = "something"; だとして、sTest[0][0]の長さ(文字数)の9を出力したいのですが、どのようにすればいいのでしょうか。 APIを調べて、クラスArrayのgetlengthを使って System.out.println(getlength(sTest[0][0])); としてみたら駄目でした。 また、Stringクラスのlengthを使って System.out.println(length(sTest[0][0])); としても駄目でした。 まだAPIにあまりなれていないのですが、書き方が間違っているのでしょうか?

    • ベストアンサー
    • Java
  • javaについて質問です。

    javaについて質問です。 シーザー暗号の暗号化と復号化のプログラムをつくりたいのですが... import java.io.*; class Prob6_2 { public static void main(String [] args)throws IOException { int key; //キー番号 String orgStr; //ターゲット文字列 String encStr; //暗号化文字列 String decStr; // 復号化文字列 String temp; BufferedReader br= new BufferedReader(new InputStreamReader(System.in)); System.out.print("ターゲット文字列:"); orgStr=br.readLine(); System.out.print("キー番号:"); temp=br.readLine(); key=Integer.parseInt(temp); Cipher cip=new Cipher (); encStr=cip.encrypt(orgStr,key); decStr=cip.decrypt(encStr,key); System.out.println("[Original Code]"+orgStr); System.out.println("[Encrypted Code]"+encStr); System.out.println("[Decrypted Code]"+decStr); } } class Cipher { String encrypt(String str,int key) { for(int i=0;i<str.length();i++){ char c=str.charAt(i); c=(char)((int)c+key); /*この後どのように一つずつの文字をつなげて文字列にしたら良いか分かりません。StringBuffer クラスのインスタンス をつかうといいというヒントは問題集に書いてあるのですが....教えて下さい*/ } } String decrypt(String str,int key) { for(int i=0;i<str.length();i++){ char c=str.charAt(i); c=(char)((int)c-key); /*この後どのように一つずつの文字をつなげて文字列にしたら良いか分かりません。StringBuffer クラスのインスタンス をつかうといいというヒントは問題集に書いてあるのですが....教えて下さい*/ } } } class Cipherのところにコメントでも書いてあるのですが、一つずつの文字をつなげて文字列にしたら良いか分かりません。どのように実現したら良いのでしょうか?><教えてください>< 違っているところがあればそこも教えて頂けるとたすかります。 お願いします>< できたらStringBufferをつかったやり方を教えてください><」

    • ベストアンサー
    • Java
  • javaについて質問です。お願いします><

    javaについて質問です。お願いします>< シーザー暗号を実現するプログラムをじゃいたのですが、import java.io.*; class Prob6_3 { public static void main(String [] args)throws IOException { int key; //キー番号 String orgStr; //ターゲット文字列 String encStr; //暗号化文字列 String decStr; // 復号化文字列 String temp; BufferedReader br= new BufferedReader(new InputStreamReader(System.in)); System.out.print("ターゲット文字列:"); orgStr=br.readLine(); System.out.print("キー番号:"); temp=br.readLine(); key=Integer.parseInt(temp); Cipher cip=new Cipher (); encStr=cip.encrypt(orgStr,key); decStr=cip.decrypt(encStr,key); System.out.println("[Original Code]"+orgStr); System.out.println("[Encrypted Code]"+encStr); System.out.println("[Decrypted Code]"+decStr); } } class Cipher { String encrypt(String str,int key) { String ret="";             //ココです1 for(int i=0;i<str.length();i++){ char c=str.charAt(i); c=(char)((int)c+key); ret+=c; } return ret; } String decrypt(String str,int key) { String ret="";              //ここです2 for(int i=0;i<str.length();i++){ char c=str.charAt(i); c=(char)((int)c-key); ret+=c; } return ret; } }   とこんな感じになり実行もできるのですが、class CipherのString encrypt(String str,int key)やString decrypt(String str,int key)のところで一つずつ文字をつなげて文字列にするにはStringBufferクラスのインスタンスを利用すると簡単だとききました。だけど記述方法がよくわからなく使用した場合のreturn文の書き方もイマイチわかりません><なのでできるだけ詳しく教えて頂けないでしょうか??お願いします。//ココですと書いてあるところです。お願いします><

    • ベストアンサー
    • Java
  • javaの問題わからなくって質問します

    内容はEclipse上でプロジェクトフォルダを作りひとつは別のjavaファイルを動かすのともう一つはそのお同じフォルダから動かされるjavaプログラムです。 説明不足というかまだ触れてそんなにたってないのでソースを載せます class SampleManager { public static void main(String[] args){ exec obj= new exec(samlple1.java); obj.say(); } } class exec{ String phrase; exec(String phrase){ this.phrase=sample2.java; } void say(){ System.out.println(phrase); } } /////// public class samlple1 { public static String java; public static void exec(String[] args) {//execをした理由はSampleManagerにあるクラスexecを呼び出れるため System.out.println("Hello,World!")//この二つの出力結果を表示したい; System.out.println("こんにちは!"); } } ひとつのフォルダに上記のソースいれてSampleManager.java からsample.javaの出力結果の HelloWorld! こんにちは! を出力したいですがエラーはなく例外処理もありませんけど何故か出力結果はnullが返ってしまいます なぜでしょうか? アドバイスをお願いします

  • javaのプログラミングについての質問です

    javaのプログラミングについての質問です 任意の複数の数値を入れたファイルを読み取りその数値の場所から次の数値まで線を描画するプログラミングを作成しました ここから発展問題としてタートルグラフィックスを 描画するプログラムを50歩進み右に90度曲がることを4度繰り返すという条件で作ってみようと思ったのですが上手くコンパイルが通りません 取りあえず分かっているのは (100.cos45,100.sin45)で90°曲がる repeat 4,forward 50right 90 end 0 だけです もし分かる方がいらっしゃいましたらご返答宜しくお願いします import java.awt.*; import java.awt.event.*; import java.io.*; public class mondai{ int x[] = new int[100]; int y[] = new int[100]; int len = 0; public static void main(String[] args){ new mondai(args[0]); } public mondai(String mondai2){ ReadFile rf = new ReadFile(mondai2); String line; while( (line = rf.gets()) != null) { String[] date = line.split(","); if(date.length == 2){ x[len] = Integer.parseInt(date[0]); System.out.println(date[0]); y[len]= Integer.parseInt(date[1]); System.out.println(date[1]); len++; } } Frame f = new Frame(); f.setTitle("Line"); f.setSize(640,480); f.setLayout(null); f.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); }}); DrawArea da = new DrawArea(); da.setBounds(0,0,640,480); f.add(da); f.setVisible(true); } private class DrawArea extends Canvas{ public void paint(Graphics g){ for(int i=0;i<len-1;i++) g.drawLine(x[i],y[i],x[i+1],y[i+1]); } } private class ReadFile{ FileInputStream fis; InputStreamReader isr; BufferedReader br; public ReadFile(String filename){ try{ fis = new FileInputStream(filename); isr = new InputStreamReader(fis); br = new BufferedReader(isr); }catch(Exception e){ e.printStackTrace(); } } public String gets(){ String line = ""; try{ line = br.readLine(); }catch(Exception e){ e.printStackTrace(); } return line; } } }

  • JavaでXORによる暗号化

    JavaでXORによる暗号化について調べていたら下記URLのサイトを見つけました。 http://www.eeb.co.jp/2007/07/_10_1.html そこでサンプルにあった下記プログラムをvalue と key を変えて実行してみたところ value の中の「は」、「で」がうまく復元されず文字化けしてしまいました。 どこが悪いのかよくわからないのですがお分かりになられる方がいらっしゃいましたら 教えていただけますでしょうか。 public class XorTest { //================================================== // メイン //================================================== public static void main(String[] args) { String value = "abcd本日はお日柄もよろしいようで"; String key = "1"; // 暗号化前出力 print("暗号化前", value); // 暗号化 byte[] byteEncodeArray = encode(value.getBytes(), key); value = new String(byteEncodeArray); // 暗号化後出力 print("暗号化後", value); // 復元 byte[] byteDecodeArray = decode(value.getBytes(), key); value = new String(byteDecodeArray); // 復元後出力 print("復元後", value); } //================================================== // 暗号化 //================================================== private static byte[] encode(byte[] src, String key) { byte[] byteKeyArray = new byte[0]; byte[] byteEncArray = new byte[src.length]; // キーの文字列を変換する文字列をカバーするまで繰り返す while(byteKeyArray.length < src.length) { byteKeyArray = (new String(byteKeyArray) + key).getBytes(); } // 変換 for (int i = 0; i < src.length; i++) { byteEncArray[i] = (byte)(src[i]^byteKeyArray[i]); } return byteEncArray; } //================================================== // 復元 //================================================== private static byte[] decode(byte[] src, String key) { return encode(src, key); } //================================================== // ダンプ文字列取得 //================================================== private static String getDump16(byte[] value) { StringBuffer buf = new StringBuffer(); for (int i = 0; i < value.length; i++) { String hex = Integer.toHexString((int)value[i] & 255); // 4桁に揃える hex = "0000" + hex; hex = hex.substring(hex.length() - 4, hex.length()); // バッファに追加(空白区切り、10桁ずつ改行) buf.append(hex + (i % 10 == 9?System.getProperty("line.separator"):" ")); } return buf.toString().trim(); } private static void print(String title, String value) { System.out.println("【 " + title + " 】"); System.out.println("-----------------------------"); System.out.println(value); System.out.println(getDump16(value.getBytes())); System.out.println(); System.out.println(); } }

    • ベストアンサー
    • Java
  • Javaの参照型変数についての質問です。

    SUN教科書Javaアソシエイツ P209 問5-7より 次のプログラムの空欄(1)に入れて実行すると、出力結果がtrueになる コードはどれですか。4つ選択して下さい。 class Sample{ public static void main(String[] args){ String s1 = "Hello"; String s2 = "Hello"; String s3 = new String("Hello"); System.out.println(【  (1)  】) } } A. s1 == s2 B. s1 == s3 C. s2 == s3 D. s1 == "Hello" E. s3 == "Hello" F. s1.equals(s3) G. s2.equals(s3) 以上が問題です。正解の選択肢はA,D,F,Gです。 正解については理解出来ています。しかし、Eの選択肢もtrueに なると思うのですがどうしてfalseなのでしょうか。 s1とs2が文字列Helloを参照しているのは分かります。 しかし、String s3 = new String("Hello");で、 s3も文字列Helloのオブジェクトを生成しているのですから、 s3もHelloを参照していることになり、s3 == "Hello"も trueになると思うのですが…。 アドバイス、よろしくお願い致します。

    • ベストアンサー
    • Java
  • JAVA 配列

    JAVAの配列の問題で複数の人間の名前と住所を出力するクラスをつくり表示するというのがあるのですが、わかりません。教えてください。 多分以下のような感じだと思うのですが・・・。 class Chap7_2{ String[] friends,address; Chap7_2(String[] f,String[] ad){ friends=f; address=ad; } void showName(){ System.out.print("My name is"+friends+". Address is"+address+"."); } public static void main(String[]args){ String[] name={"Sayaka Kikumoto","Akiko Hayakawa","Chika Kondo"}; String[] ken={"Mie","Aichi","Ehime"}; Chap7_2 a=new Chap7_2(name[i],ken[i]); for(string i=0;i<a.length;i++); a.showName(); } } }

    • ベストアンサー
    • Java
  • javaのfor文の使い方

    コマンドライン引数で入力した文字が3文字以下ならその文字列を20個文字連結して表示し、4文字以上ならたくさんと表示したいのですが表示できません。 import java.io.*; public class ABC { public static void main(String args[])throws IOException{ BufferedReader myReader = new BufferedReader( new InputStreamReader(System.in), 1 ); String str = myReader,readLine(); if(str.length() >= 4){ System.out.println("たくさん"); } StringBuffer buf = new StringBuffer(str.length()*20); for(int i = 0;i < 20; i++){ buf.append(str); System.out.println(buf); } } } としたら、たくさんと表示されません。どこを修正すればいいでしょうか?ちなみにfor文とStringBufferクラスを用いてというのが条件です。

  • Java ApachePOIについて

    サーブレットとApachePOIについて質問です。 下記のソースで書き込んだセルをすべて黄色で塗りつぶしをしたいのですが、 ソースの書き方を教えてください。 以上、お願いします。 「ソース」 // 業務名前 String[] name4 = request.getParameterValues("gyoumuname"); for (int i = 0; i < name4.length; i++) { System.out.println(i + " " + name4[i]); name4[i] = new String(name4[i].getBytes("8859_1"), "UTF-8"); List outList=new ArrayList(); for (int i = 0; i < name4.length; i++) { outList.add(name4[i]); } for (int i = 0; i < outList.size(); i++) { Row row5 = sheet.getRow(8 + i); row5.getCell(3).setCellValue(new HSSFRichTextString(outList.get(i).toString())); } // 値を書き込んだエクセルを出力する FileOutputStream out = null; try { out = new FileOutputStream( "C:\\Users\\satou\\Desktop\\weekreport.xls"); workbook.write(out); } catch (IOException e) { System.out.println(e.toString()); } finally { try { out.close(); } catch (IOException e) { System.out.println(e.toString()); } } 以下省略。

専門家に質問してみよう