我有一个问题,我必须为给定的数独编码自动解决方案,这是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;
}
};
答案 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
声明,但我不确定它是否会解决您正在努力解决的错误......