我正在尝试使用此脚本生成数独板:
问题在于我不知道如何验证如何在列和方块上生成唯一数字。
实际上只是在行上验证和生成唯一数字。
这是代码:
function generate(count, values) {
return Array.apply(null, { length: count }).map(function () {
var r = [],
array = values.slice();
while (array.length) {
r.push(array.splice(Math.floor(Math.random() * array.length), 1)[0]);
}
return r;
});
};
var myStringArray = generate(9, [1, 2, 3, 4, 5, 6, 7, 8, 9]);
Array.from(document.getElementsByClassName('cell')).forEach(function(e, i){
var y = Math.floor(i/myStringArray.length);
var x = i % myStringArray.length;
e.textContent = myStringArray[y][x];
});

.container{
min-height: 100vh;
width: 100%;
display: flex;
align-items : center;
justify-content : center;
margin-bottom: 0;
}
.table {
display:table;
border: 2px solid #444;
border-collapse: collapse;
position: relative;
}
.row {
display:table-row;
position: relative;
z-index:-1;
}
.cell {
display:table-cell;
padding:8px;
border: 1px solid #ff0000;
text-align: center;
}
.cell:nth-child(3), .cell:nth-child(6){border-right: 5px solid #555; } /*vertical*/
.row:nth-child(3) .cell, .row:nth-child(6) .cell{border-bottom: 5px solid #555;} /*horizontal*/
.header {
text-align:center;
position: relative;
}
.header {
counter-increment: colno;
}
.header::before {
content: counter(colno);
position: absolute;
top: -30px;
font-weight:bold;
color: #777;
}
.row:nth-child(n+1) {
counter-increment: rowno;
}
.row:nth-child(n+1)::before{
content: counter(rowno);
position: absolute;
left: -30px;
top:10px;
font-weight:bold;
color: #777;
}

<div class="container">
<div class="table">
<div id="mytab1" class="row">
<span class="cell header">***</span>
<span class="cell header">***</span>
<span class="cell header">***</span>
<span class="cell header">***</span>
<span class="cell header">***</span>
<span class="cell header">***</span>
<span class="cell header">***</span>
<span class="cell header">***</span>
<span class="cell header">***</span>
</div>
<div class="row">
<span class="cell">***</span>
<span class="cell">***</span>
<span class="cell">***</span>
<span class="cell">***</span>
<span class="cell">***</span>
<span class="cell">***</span>
<span class="cell">***</span>
<span class="cell">***</span>
<span class="cell">***</span>
</div>
<div class="row">
<span class="cell">***</span>
<span class="cell">***</span>
<span class="cell">***</span>
<span class="cell">***</span>
<span class="cell">***</span>
<span class="cell">***</span>
<span class="cell">***</span>
<span class="cell">***</span>
<span class="cell">***</span>
</div>
<div class="row">
<span class="cell">***</span>
<span class="cell">***</span>
<span class="cell">***</span>
<span class="cell">***</span>
<span class="cell">***</span>
<span class="cell">***</span>
<span class="cell">***</span>
<span class="cell">***</span>
<span class="cell">***</span>
</div>
<div class="row">
<span class="cell">***</span>
<span class="cell">***</span>
<span class="cell">***</span>
<span class="cell">***</span>
<span class="cell">***</span>
<span class="cell">***</span>
<span class="cell">***</span>
<span class="cell">***</span>
<span class="cell">***</span>
</div>
<div class="row">
<span class="cell">***</span>
<span class="cell">***</span>
<span class="cell">***</span>
<span class="cell">***</span>
<span class="cell">***</span>
<span class="cell">***</span>
<span class="cell">***</span>
<span class="cell">***</span>
<span class="cell">***</span>
</div>
<div class="row">
<span class="cell">***</span>
<span class="cell">***</span>
<span class="cell">***</span>
<span class="cell">***</span>
<span class="cell">***</span>
<span class="cell">***</span>
<span class="cell">***</span>
<span class="cell">***</span>
<span class="cell">***</span>
</div>
<div class="row">
<span class="cell">***</span>
<span class="cell">***</span>
<span class="cell">***</span>
<span class="cell">***</span>
<span class="cell">***</span>
<span class="cell">***</span>
<span class="cell">***</span>
<span class="cell">***</span>
<span class="cell">***</span>
</div>
<div class="row">
<span class="cell">***</span>
<span class="cell">***</span>
<span class="cell">***</span>
<span class="cell">***</span>
<span class="cell">***</span>
<span class="cell">***</span>
<span class="cell">***</span>
<span class="cell">***</span>
<span class="cell">***</span>
</div>
</div>
</div>
&#13;
请访问小提琴 here
感谢您的帮助, 感谢
答案 0 :(得分:1)
您需要回溯,因为可以向Sudoku棋盘添加数字,这些数字不会立即违反任何规则,但这会导致后来出现矛盾。如果您采取任何独特解决方案Sudoku问题并随意在任何地方放置任何数字,您一定会体验到这一点。
我建议您调查Dancing Links算法。您可以轻松地将Sudoku制定为集合覆盖问题,并且该算法可以找到解决方案(如果存在)。对于完全空的板,必须有一个解决方案。如果要获得随机结果,请随机化矩阵。
同时调查all the other sudoku-tagged questions,因为您不是第一个尝试生成此类主板的人,并且从一种语言转换为另一种语言并不能真正改变游戏。