c++ - C++中的数独棋子算法

标签 c++ algorithm sudoku

我目前正在研究一种算法,使用数字 1-9 不重复地查找所有 9 位数字。我正在测试我的理论,即这样过滤数字将有助于提高数独检查器的效率。

我实现的代码执行以下操作。它对数字中的第 1-9 位使用 for 循环,例如 (a)(b)(c)(d)(e)(f)(g)(h)(i) = ###### ###。

我的理论是,通过检查数字 (a-i) 的总和是否等于 45,a 到 i 的乘积等于 9!并且 a-i 的倒数之和大约等于 2.828968(或 1 + 1/2 + 1/3 ... 1/9)

问题是我用a-i的倒数之和过滤9位数字后,预测的9位可能数字的个数小于9! (可能数字的实际数量)。我不确定为什么要过滤这么多,但它捕获的数字没有任何重复(这很好)。

我的想法是我玩 double 的方式搞乱了算法。

这是我的代码:

#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
    int product;
    int sum;
    int count=0;
    double inverseSum;
    double correctInverseSum=(1.0/1.0)+(1.0/2.0)+(1.0/3.0)+(1.0/4.0)+(1.0/5.0)+
(1.0/6.0)+(1.0/7.0)+(1.0/8.0)+(1.0/9.0);
        for(double a=1.0; a<10.0; a++){
            for(double b=1.0; b<10.0; b++){
                for(double c=1.0; c<10.0; c++){
                for(double d=1.0; d<10.0; d++){
                    for(double e=1.0; e<10.0; e++){
                        for(double f=1.0; f<10.0; f++){
                            for(double g=1.0; g<10.0; g++){
                                for(double h=1.0; h<10.0; h++){
                                    for(double i=1.0; i<10.0; i++){
                                        product=a*b*c*d*e*f*g*h*i;
                                        sum=a+b+c+d+e+f+g+h+i;
                                        if(product==9*8*7*6*5*4*3*2*1 && sum==45){
                                            inverseSum=(1.0/a)+(1.0/b)+(1.0/c)+(1.0/d)+
                                            (1.0/e)+(1.0/f)+(1.0/g)+(1.0/h)+(1.0/i);
                                            if(inverseSum==correctInverseSum)
                                            {
                                                count++;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    cout<<"This is the count:"<<count<<endl;
    return 0;
}

最佳答案

既然我在看到这么多 for 循环后洗了眼睛,我会说一个候选者是:

if(inverseSum==correctInverseSum)

double s 不能完全表示,因此您必须使用小 epsilon 检查是否相等。像这样的东西:

if (fabs(inverseSum - correctInverseSum) < std::numeric_limits<double>::epsilon())

您需要 #include <limits> .

关于c++ - C++中的数独棋子算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12556137/

相关文章:

c++ - 检查对是否为空或未初始化

c++ - 为什么会崩溃?

algorithm - 修改距离以违反三角不等式

html - 区分数独 HTML 中的默认输入和用户输入

c++ - 在类 File 和 Buffer 中查找段错误

c++ - 捕获单元测试库链接错误

algorithm - 将重叠的凸多边形合并为单个凹多边形的最佳方法?

javascript - 用 O(n) 求解第七个

JavaFX - 单击 GridPane 内部打印出 Pane 而不是 TextField

java - 数独检查子网格错误