【问题标题】:How to make this algorithm of pattern finding?如何制作这种模式查找算法?
【发布时间】:2012-04-04 06:53:58
【问题描述】:

我有一个矩阵,我需要在这个矩阵中找到一个模式。 矩阵是:

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位的格局不好。

如何根据这些规则制定算法?

【问题讨论】:

  • 您已经“制作”了算法。我不明白为什么你不只是用你最喜欢的编程语言编写指令列表并继续使用它。如果您遇到困难,或者您认为您的算法不是最优的(在某种意义上),请再次发布您的代码,我们会提供一些帮助。

标签: algorithm math statistics pattern-matching


【解决方案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;

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-20
      • 2021-02-25
      • 1970-01-01
      • 2023-04-09
      • 2012-07-08
      • 1970-01-01
      • 2021-01-12
      • 2022-12-06
      相关资源
      最近更新 更多