-2

これは、「考えられるすべての組み合わせを一覧表示するにはどうすればよいですか? 」からの拡張された質問です。最後の質問では、すべての組み合わせではなく、すべての順列が表示されました。

$num_array2 = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

foreach($num_array2 AS $value1) {
    foreach($num_array2 AS $value2) {
        if($value2 == $value1) {
            continue;
        }
        foreach($num_array2 AS $value3) {
            if($value3 == $value1 || $value3 == $value2) {
                continue;
            }
            foreach($num_array2 AS $value4) {
                if($value4 == $value1 || $value4 == $value2 || $value4 == $value3) {
                    continue;
                }
                foreach($num_array2 AS $value5) {
                    if($value5 == $value1 || $value5 == $value2 || $value5 == $value3 || $value5 == $value4) {
                        continue;
                    }
                    foreach($num_array2 AS $value6) {
                        if($value6 == $value1 || $value6 == $value2 || $value6 == $value3 || $value6 == $value4 || $value6 == $value5) {
                            continue;
                        }
                        echo "$value1, $value2, $value3, $value4, $value5, $value6 \n<br />";
                    }
                }
            }
        }
    }
}

結果は次のようになります。

1, 2, 3, 4, 5, 6 
1, 2, 3, 4, 5, 7 
1, 2, 3, 4, 5, 8 
1, 2, 3, 4, 5, 9 
1, 2, 3, 4, 5, 10 
1, 2, 3, 4, 6, 5 
1, 2, 3, 4, 6, 7 
1, 2, 3, 4, 6, 8 
1, 2, 3, 4, 6, 9 
1, 2, 3, 4, 6, 10 

ご覧のとおり、「1, 2, 3, 4, 5, 6」と「1, 2, 3, 4, 6, 5」が繰り返されています (同じ順序ではありませんが)。「1, 2, 3, 4, 6, 5」のような結果を表示したくありません。コードをどのように変更すればよいですか?

4

1 に答える 1

1

エスカレーションに関するコードの問題を無視すると、問題は、数字が繰り返されないように出力を制限しているだけであるという事実にあります。ただし、より強力な制約が必要です。2 つの異なる出力に対して同じ選択を行わないようにします。

それを取得する簡単な方法は、既に選択した配列位置を追跡することです。num_array2のビット配列を考えてみましょう。この配列は選択を表すため、位置を取得した場合、 num_array2のiの場合、ビット配列には 1 が含まれている必要があります。その位置に。

次に、ビット配列をセットの「選択シグネチャ」に格納し、可能な出力ごとに、その選択シグネチャが既にそのセットにあるかどうかを確認できます。

これはかなり単純でばかげた解決策ですが、問題を理解するのに役立つと思います。

于 2013-11-11T09:35:17.270 に答える