0

我有一个问题,我必须为给定的 4x4 数独编写自动解决方案,这意味着数字只能达到 1 2 3 4。这是数独的简化版本,因为我还是编程新手。

我有一个给定的模板,其中生成了随机数独,我必须编写一个代码来自动解决数独问题。
这是我一开始必须解决的数独问题

sudoku[6] = [[" ","2"," "," "],
             [" "," ","2"," "],
             [" "," "," ","3"],
             ["4"," "," "," "]

我的想法是将“1234”插入空的“”中,然后当列、行和象限中已经存在一个数字时,从“1234”中删除这些数字。所以我想做的是使用循环遍历表中的所有位置,当我发现例如“1”时,我将从“1234”中删除1。

这是我的代码的开始,它似乎在我到达 if 的那一刻不起作用,你们能告诉我我做错了什么或者为什么当我到达我的 If 时它不起作用。先感谢您。

var sudoku = sudoku[6];

// function to put "1234" into empty space ""
var concatenate = function (s)
{ 
   for (i=0; i<s.length; i++)
       for (j=0; j<s.length; j++)
            if (sudoku[i][j] === " ")
                sudoku[i][j] = "1234";
};

concatenate(sudoku);

// function to solve the sudoku automatically. 

var solve = function (t)
{ 
    for (i = 0; i<t.length; i++)
       for (j=0; j<t.length; j++)
           for (k=j; k<(4+j); k++)
                if (sudoku[i][j].length === 1)    // this is where it seems to bug, in this if im trying to find the position where we only have one number and not "1234"
                    var s = sudoku[i][j];
                if (sudoku[i][k-j] !== ("1" || "2" || "3" || "4"))  // here im finding the position of all position in the sudoku where ive got "1234" so i can remove the number found in the previous if.
                    {
                        var index = sudoku[i][k-j].indexOf(s);
                        var string_new = sudoku[i][k-j].substring(0,index) + sudoku[i][k-j].substring(index+1, 4);
                        sudoku[i][k-j] = string_new; 
                    }
};
4

2 回答 2

0

有已知的算法可以解决数独问题,你应该看看。

对于像您这样的小型数独,您可以选择不考虑计算时间来实现。(选择最简单的实现)

欲了解更多信息:数独求解算法

回顾你的代码,这个想法(在纸上)还不错,但我真的不明白你打算用它做什么。例如:

if (sudoku[i][k-j] !== ("1" || "2" || "3" || "4"))

这条线没有意义。表达式 ("1" || "2" || "3" || "4") 将始终计算 "1"。所以你在写:

if (sudoku[i][k-j] !== "1")

此外 sudoku[i][kj] 是一个包含“1234”(或其中一部分)的字符串,因此您应该使用 indexOf 来检查字符的存在。

内部的用途是什么?

  for (k=j; k<(4+j); k++)

为什么要从 j 迭代到 4+j?您总是使用 kj 来访问变量 (sudoku[i][kj]),它总是在 jj 和 4+jj 之间。那么为什么不:

  for (k=0; k<4; k++)

您的代码中还有更多其他逻辑错误......如果您想实现这个想法,您应该花时间思考您正在编写的内容,或者(更好地)使用已知算法。

于 2013-11-12T07:33:48.717 回答
0

你应该替换这个:

if (sudoku[i][k-j] !== ("1" || "2" || "3" || "4"))

像这样:

if ( sudoku[i][k-j] !== "1" || sudoku[i][k-j] !== "2" || ...

或者你也可以考虑使用一个switch语句,但我不确定它是否能解决你正在努力解决的错误......

于 2013-11-12T08:35:11.427 回答