-1

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

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

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

4

1 回答 1

1

由于每个允许的矩阵都是 [0,9] 中的九个数字的运行,因此从 000000000 到 999999999 的每个九位数字对应于您要检查的矩阵之一。因此,遍历这些矩阵基本上意味着计算九位数字,然后读取数字以获得矩阵元素。问题是读取这些数字需要时间,而且你要读 10^9 次。如果您通过递增 an 进行计数,int那么您每次都必须转换为字符串并读取字符,或者每次使用地板和模除法来挑选一个数字,这两种方法都不可接受。

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

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

于 2013-06-30T16:15:56.920 回答