如何制作这种模式发现算法?

时间:2012-04-04 06:53:59

标签: algorithm math statistics pattern-matching

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

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规则选择的数字的位置必须是精确的模式。
  4. 所以问题是:

    找到尊重3条规则的最佳模式。 显示的矩阵示例:

    1. 选择一个数字:0(2)//“()”中的内容表示值的位置。位置从1到10开始。
    2. 1(4)
    3. 对于位置2和4来说,模式必须支持矩阵其余部分的规则1和2。
    4. 所以我们在第3行进一步检查第2位:1。我们走第4排,检查第4位:0。似乎尊重规则。在第2和第4位置有相反的数字,所以我们继续:第5行,第2位:,依此类推,但是你会看到第7行第2位:1和第8行第4位:1;所以2-4位的模式不好。

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

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

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