3

私はこれをコーディングし始める方法に固執しています。次のことができるようになりたいです。これは古典的なコインの裏返しの問題です。2回裏返すと、次の ようになります。TT
TFFTFF
一度 に 1つの結果で配列を作成できるようにしたい。これをわかりやすく説明するには、次のようにする必要があります(ちなみに、Javaを使用しています): boolean [] Cases = new boolean [numberOfFlips]



初めてのケースは次のようになります:TT。
この結果で他の計算を行った後、次に進み、ケースを作成します:TFそして他の計算の実行を続行します。
誰かが私を正しい方向に導いてくれますか?よろしくお願いします。どの言語のアルゴリズムでも問題ありません。お時間をいただきありがとうございます!(:

4

4 に答える 4

4

Javaでバイナリデータを保存する方法はたくさんありますが、何を保存するかは明確ではありません。フリッピングの可能なすべての組み合わせを保存するN場合は、配列が必要ですnew boolean[2^N][N]

Javaには、パワーを上げるための別の構文があることを忘れないでください。

アップデート

N以下は、フリップのすべての組み合わせを保存するためのコードです。

それから、1つの組み合わせを生成する方法もわかります。組み合わせの序数の2進表現からです。コメントを参照してください。

    // number of flips
    // limit it by 31
    int N = 3;

    // number of combinations
    // using bitshift to power 2
    int NN = 1<<N;

    // array to store combinations
    boolean flips[][] = new boolean[NN][N];

    // generating an array
    // enumerating combinations
    for(int nn=0; nn<NN; ++nn) {

        // enumerating flips
        for( int n=0; n<N; ++n) {

            // using the fact that binary nn number representation
            // is what we need
            // using bitwise functions to get appropriate bit
            // and converting it to boolean with ==
            flips[nn][N-n-1] = (((nn>>n) & 1)==1);

            // this is simpler bu reversed
            //flips[nn][n] = (((nn>>n) & 1)==1);

        }

    }

    // printing an array
    for(int nn=0; nn<NN; ++nn) {

        System.out.print("" + nn + ": ");

        for( int n=0; n<N; ++n) {
            System.out.print(flips[nn][n]?"T ":"F ");
        }
        System.out.println("");
    }
于 2012-12-08T10:07:38.057 に答える
1

目的の出力と整数のバイナリ表現の類似性に注意してください。次に例を示します。

for(int i = 0; i < 4; ++i) {
    boolean first = (i & 1) == 0;
    boolean second = (i & 2) == 0;
    System.out.println(first + "\t" + second);
}

プリント:

true    true
false   true
true    false
false   false
于 2012-12-08T10:08:06.833 に答える
1

これは、(理由の範囲内で)任意の数のフリップで機能する一般的なソリューションです。

public class Flips {

    static void generate(boolean[] res, int start) {
        if (start == res.length) {
            System.out.println(Arrays.toString(res));
        } else {
            generate(res, start + 1);
            res[start] = true;
            generate(res, start + 1);
            res[start] = false;
        }
    }

    static void generate(int n) {
        boolean res[] = new boolean[n];
        generate(res, 0);
    }

    public static void main(String args[]) {
        generate(4);
    }
}

質問の順序とは異なる順序で組み合わせが生成されますが、それが重要な場合は、順序に一致するように変更するのは簡単です。

于 2012-12-08T10:09:04.290 に答える
1

再帰の使用:

public static void main(String args[]) {
int size = 3;
generateTable(0, size, new int[size]);
}

private static void generateTable(int index, int size, int[] current) {
if(index == size) { 
    for(int i = 0; i < size; i++) {
        System.out.print(current[i] + " ");
    }
    System.out.println();
} else {
    for(int i = 0; i < 2; i++) {
        current[index] = i;
        generateTable(index + 1, size, current);
    }
}
}
于 2012-12-08T10:10:51.610 に答える