在javascript中解决4x4(简化的)数独

时间:2013-11-12 05:21:11

标签: javascript algorithm sudoku

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

我有一个给定模板,其中生成了随机数据,我必须编写一个代码来自动解决数据。
这就是我在开始时所拥有的数据,我必须解决

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

我的想法是将“1234”插入空“”,然后在“1234”中删除数字,其中一个数字已存在于列,行和象限中。所以我想要做的是使用循环遍历表中的所有位置,并且当我找到例如“1”时,我将从“1234”中删除1。

以下是我的代码的打开,看来它在我达到的那一刻不起作用,如果你能告诉我我做错了什么或为什么当我到达我的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; 
                    }
};

2 个答案:

答案 0 :(得分:0)

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

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

更多信息:Sudoku solving algorithms

尊重你的代码,这个想法(在纸面上)并不坏,但我真的无法理解你打算用它做什么。例如:

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

这条线毫无意义。表达式(“1”||“2”||“3”||“4”)将始终计算“1”。所以你在写:

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

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

内部的用途是什么?

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

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

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

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

答案 1 :(得分:0)

你应该替换这个:

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

这样的事情:

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

或者您也可以考虑使用switch声明,但我不确定它是否会解决您正在努力解决的错误......