【问题标题】:Simple brute force troubleshoot简单的蛮力故障排除
【发布时间】:2012-01-12 10:26:15
【问题描述】:

我需要帮助修复对一组数字 1=9 的非常简单的蛮力攻击。我的目标是解决一个 sudoko 板,其中一行充满 8 个数字,这样一行就只能剩下一个数字。 我想到的唯一方法是为丢失的单元格分配一个数字,然后将其与行中的所有其他数字进行检查。我真的很接近解决方案,但返回始终是 1。这是我遇到问题的代码的 sn-p: 我更新了代码,现在它添加所有数字并减去它们从 45 找到正确的数字。它仍然没有返回正确的数字。它返回 423(其中 6 作为缺失的数字)。

int radd1=deduct[0][0]+deduct[0][1]+deduct[0][2]+deduct[0][3]+deduct[0][4]+deduct[0] int test=0;
if (radd1==8) {
    for (int control=0; control<9; control++) {
        if (dash[0][control]=='_') {
            empty=control;
        }
    }
    for (int control2=0; control2<9; control2++) {
        if (control2!=empty) {
            test=test+dash[0][control2];
        }
    }
    cout << test << endl;
}

更多信息:
整个解决方案基于一个 9x9 的字符,其中填充了数字以进入适当的位置。这个字符被称为dash[9][9]
deduct[9][9] 字符是 dash[9][9] 的重复字符,除了那里没有实际数字,而是有一个 1。这样我就可以加起来一整行,如果它等于8,请执行我简单的蛮力(如果这是正确的术语)来找到最后的第九个数字。 empty 是一个整数。它存储(在这种情况下)没有编号的列号。
发现任何问题?

【问题讨论】:

  • 如果 deduct 是 9×9,你有一个错误,你访问 deduct[0][9],很可能会读取 deduct[1][0]
  • @DanielFischer 实际上没有。 FOR 循环在 0 开始并运行一次,在 8 结束,因为我指定了 control&lt;9
  • 您必须考虑到您在数组中使用了字符,这些字符可以用作整数,但 '0' 的字符与数字 0 不同。要恢复整数值你必须使用dash[0][control2]-'0'
  • @Redmastif radd1 的计算原来使用了deduct[0][9]。我指的是那个。
  • @madth3 我实际上将char dash[9][9] 更改为int dash[9][9] 以解决我遇到的另一个问题。

标签: c++ brute-force


【解决方案1】:
  1. 在添加 radd1 的同时使用 deduct[0][9] 是错误的,对吧?
  2. dash[0][control3] 的比较在一个循环内进行,因此test 的值始终依赖于循环的最后一次迭代。 (在这种情况下,control2+1 vs dash[0][8]。我想如果存在平等,你就必须打破循环。
  3. 您将control2+'1' 分配给dash[0][empty],但后来使用control+1。 (不是一回事)
  4. 条件if (test==1) 内的整个赋值和比较感觉不正确,但仅从包含的代码中我们无法确定它是否正确。

有一种更好的方法可以找到未使用的号码。我们知道1+2+..+9 = 45 的总和,因此您只需将出现的数字相加并从 45 中减去即可获得缺失的数字。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-15
    • 2010-11-30
    • 2021-09-11
    相关资源
    最近更新 更多