10

0 = 空白、1 = X、2 = O の構造の19,683 個の Tic-Tac-Toe ボード レイアウトをすべて含むテキスト ファイルを生成したいと考えています。残念ながら、数学は私の得意分野ではなく、例を見つけることができないようですこれのどこでも。

これは宿題のためではありません。ボードのセットアップに基づいて最適な動きを表す RGB 値を含む画像を生成するために、このデータを Minimax 計算機で実行するつもりです。関数をサポートしていない (イベント駆動型の) プラットフォーム用に Tic-Tac-Toe を開発しているので、ボードをゲーム内の数値に変換してから、画像内のピクセルの RGB を検索します。移動は。これは生意気な回避策ですが、145x145 ピクセルの画像以上の RAM は必要ありません (145x145 = 21,025 なので、各ピクセルはボードに基づいて推奨される動きを効果的に表します)。これは、CPU 時間を無駄にする必要がないことも意味します。これは、もう 1 つの利点です。

4

7 に答える 7

7

9 つの位置と 3 文字 (X、O、空) のアルファベットがあります。可能な組み合わせの総数は 3^9 = 19683 です。

for(int i = 0; i < 19683; ++i)
{
    int c = i;
    for (int j = 0; j < 9; ++j)
    {
        cout << (c % 3) << " ";
        c /= 3;
    }

    cout << endl;
}
于 2011-09-19T05:36:20.293 に答える
4

ボード レイアウトが必要なので、数が少ない (19683)。

これらすべてを力ずくで生成できます。各ボックスには 3 つの可能性しかありません。9 つのボックスがあり、それらすべてを実行します。

編集:

int c = 0;
while (c < 262144){
    bool valid = (c & 3) < 3;
    valid &= ((c >>  2) & 3) < 3;
    valid &= ((c >>  4) & 3) < 3;
    valid &= ((c >>  6) & 3) < 3;
    valid &= ((c >>  8) & 3) < 3;
    valid &= ((c >> 10) & 3) < 3;
    valid &= ((c >> 12) & 3) < 3;
    valid &= ((c >> 14) & 3) < 3;
    valid &= ((c >> 16) & 3) < 3;

    if (valid){
        int i = c;
        int j = 0;
        while (j < 9){
            cout << (i & 3) << " ";
            i >>= 2;
            j++;
        }
        cout << endl;
    }

    c++;
}

これにより、19,683 個のボード レイアウトがすべて印刷されます。どの形式が必要かはわかりませんが、出力からそれを抽出するのはかなり簡単なはずです。

于 2011-09-19T04:34:17.373 に答える
3

単純に力ずくで通り抜けることができます。各正方形は 0、1、または 2 なので...:

for (int i1 = 0; i1 <= 2; i++) {
    for (int i2 = 0; i2 <= 2; i++) {
        // ...
        // lot's of nested for loops
        // ...
    }
}

または、それが気にならない場合は ;) そのための再帰関数を書くことができます:

int square[9];
void place(int square_num) {
    if (square_num == 9) {
        output the current configuration
    }

    for (int i = 0; i <= 2; i++) {
        square[square_num] = i;
        place(square_num+1);
    }
}

次に、次のようにします。

place(0);

そして魔法が起こります。

ちなみにこれはC++です。

于 2011-09-19T04:35:08.493 に答える
0

以前のソリューションと同様ですが、Python で読みやすくなっています。

for i in range(3**9):
     c = i
     for j in range(9):
         if j % 3 == 0:
             print("")
         print(str(c % 3) + " ", end='')
         c //= 3
     print("")
于 2017-06-12T20:50:44.017 に答える