2

マトリックスがあり、このマトリックス内のパターンを見つける必要があります。マトリックスは次のとおりです。

1 0 0 1 1 1 0 0 0 1
0 0 0 1 1 0 1 0 0 1
0 1 1 1 0 0 0 1 0 1
1 0 1 0 0 1 1 0 1 0
1 1 1 0 0 0 1 1 0 1
0 1 0 0 1 1 0 1 0 1
1 1 1 0 0 0 1 0 0 1
1 0 0 1 0 1 1 1 0 1

ルール:

  1. すべての行から 1 つの数字を選択します。
  2. 2 番目の行から次に選択される番号は、先例の反対でなければなりません。
  3. ルール 1 とルール 2 によって選択される数字の位置は、正確なパターンでなければなりません。

したがって、質問は次のようになります。

3 つのルールを尊重する最適なパターンを見つけます。示されているマトリックスの例:

  1. 選択された数値: 0(2) //"()" の内容は、値の位置を表します。位置は、行の 1 から 10 まで始まります。
  2. 1(4)
  3. 位置 2 と 4 をパターンにするためには、マトリックスの残りの部分でルール 1 と 2 をサポートする必要があります。

そのため、さらに 3 行目に進み、2 番目の位置を確認します:1. 4 行目に移動し、4 番目の位置を確認します:0。ルールを守っているようです。2 番目と 4 番目の位置には反対の番号があるので、5 行目、2 番目の位置: などと続けますが、7 行目には 2 番目の位置:1 と 8 行目の 4 番目の位置:1 が表示されます。そのため、位置 2 ~ 4 のパターンは良くありません。

これらのルールに基づいてアルゴリズムを作成するにはどうすればよいですか?

4

2 に答える 2

1

多分これが役立つでしょう(あなたの質問へのコメントが動機です)。これはC++の答えです。この回答では、選択した数字が常に 0 であることを前提としていますが、これを簡単に編集して 1 を最初にすることができます。

int firstPos, secondPos;

for(int i = 0; i < 10; ++i)
    if(matrix[0][i] == 0)
        firstPos = i;

for(int i = 0; i < 10; ++i)
    if(matrix[0][i] == 1)
        secondPos= i;

bool success = true;

for(int i = 0; i < 10/2; ++i)
    if(matrix[2*i][firstPos] == matrix[2*i][secondPos])
        success == false;

if(success)
    cout << "success" << endl;
else 
    cout << "failure" << endl;
于 2012-04-04T08:30:23.217 に答える
0

最初の項目 (F) のインデックスと 2 番目の項目 (S) のインデックスによってパターンを定義します。また、インデックスは 0 で始まると仮定します (例のように 1 ではなく)。F と S はどちらも 0 から 9 までの値を取ることができます。解決策は簡単です。F と S を 0 から 9 まで実行する二重のネストされたループを作成し、最も内側の 3 番目のループで、現在の F と S がパターンを形成することを確認します。

于 2012-04-04T11:21:57.580 に答える