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. 我们从每一行中选择一个数字。
  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) 的索引和第二项 (S) 的索引来定义一个模式。我还将假设索引以 0 开头(而不是您的示例中的 1)。F 和 S 都可以取 0 到 9 之间的值。解决方案很简单。有一个从 0 到 9 运行 F 和 S 的双嵌套循环,在第三个最里面的循环中,只需验证当前 F 和 S 形成一个模式。

于 2012-04-04T11:21:57.580 回答