如何开发代码逻辑以检查3x3矩阵中的所有可能的排列?

时间:2013-06-30 15:04:51

标签: c++ matrix permutation

我正在制作一个程序来检查给定的矩阵是否是魔方。 (每个行或列中的数字或对角线加起来相同的数字的正方形)。该程序可以成功检查任何3x3矩阵,但现在我需要它打印出所有可能的魔术方块。

因此,它必须检查所有可能的3x3矩阵(值的矩阵范围在1-9之间)。这将是10 ^ 9种组合(对吧?)

我认为这可以通过放置9个嵌套的for循环来完成,但这会让人筋疲力尽。有没有更简单的方法呢?

1 个答案:

答案 0 :(得分:1)

由于每个允许的矩阵是来自[0,9]的九个数字的运行,因此从000000000到999999999的每九个数字对应于您要检查的一个矩阵。因此,迭代这些矩阵基本上意味着以九位数字计数,并且读取数字以获得矩阵元素。问题是读取这些数字需要花费时间,而你正在做10到9次。如果你通过递增一个int进行计数,则每次都必须转换为字符串并读取字符,或者每次使用floor和modulo除去一个数字,这两个数字都不可接受。

解决方案是将矩阵表示为9 int s的数组,每个数字对应该九位数,并通过递增int来计数。然后读取数字就像访问数组元素一样简单。你可以用递归函数计算这个:

void count(int * matrix, int pos, int * magicCount)
{
do
{
    if(pos<8)
    {
        count(matrix, pos+1, magicCount);
    }
    else
    {
        if(isMagic(matrix))
        {
            (*magicCount)++;
        }
    }
    matrix[pos] += 1;
}
while(matrix[pos] < 10);
for(; pos<9; pos++)
{
    matrix[pos] = 0;
}
}

http://en.wikipedia.org/wiki/Binary_coded_decimal