数独JavaScript数组
我有个面试。我必须现场编码。我解决不了这个问题,问题是数独JavaScript数组,javascript,arrays,sudoku,Javascript,Arrays,Sudoku,我有个面试。我必须现场编码。我解决不了这个问题,问题是 您有两组嵌套数组,这些是规则 每行必须包含数字1到9,不得重复 每列必须包含数字1到9,不得重复 每个3x3块必须包含数字1到9,不得重复 我试了第一个部分,但我不知道如何添加丢失的数字,其余部分我也不知道 “严格使用” const invalidBoard=[ [ 5, 3, 4, 6, 7, 9, 8, 1, 2 ], [ 6, 7, 2, 1, 9, 5, 3, 4, 7 ], [ 6, 9, 8, 3, 4,
- 您有两组嵌套数组,这些是规则
- 每行必须包含数字1到9,不得重复
- 每列必须包含数字1到9,不得重复
- 每个3x3块必须包含数字1到9,不得重复
“严格使用”
const invalidBoard=[
[ 5, 3, 4, 6, 7, 9, 8, 1, 2 ],
[ 6, 7, 2, 1, 9, 5, 3, 4, 7 ],
[ 6, 9, 8, 3, 4, 2, 7, 6, 5 ],
[ 8, 5, 9, 7, 6, 1, 4, 2, 1 ],
[ 4, 2, 6, 8, 5, 3, 7, 8, 1 ],
[ 7, 1, 3, 9, 2, 4, 8, 5, 6 ],
[ 9, 6, 1, 5, 3, 7, 2, 8, 4 ],
[ 2, 8, 7, 4, 1, 9, 6, 3, 5 ],
[ 3, 4, 5, 2, 8, 6, 1, 8, 8 ],
];
常数有效板=[
[ 5, 3, 4, 6, 7, 8, 9, 1, 2 ],
[ 6, 7, 2, 1, 9, 5, 3, 4, 8 ],
[ 1, 9, 8, 3, 4, 2, 5, 6, 7 ],
[ 8, 5, 9, 7, 6, 1, 4, 2, 3 ],
[ 4, 2, 6, 8, 5, 3, 7, 9, 1 ],
[ 7, 1, 3, 9, 2, 4, 8, 5, 6 ],
[ 9, 6, 1, 5, 3, 7, 2, 8, 4 ],
[ 2, 8, 7, 4, 1, 9, 6, 3, 5 ],
[ 3, 4, 5, 2, 8, 6, 1, 7, 9 ],
];
log(“无效板无效:+!isValid(invalidBoard));
log(“有效板有效:+isValid(validBoard));
功能有效(板){
//这是我写的
对于(i=0;iitem,这里有一个仅适用于水平和垂直方向的小解决方案:
function isValidHorizontal(sudoku) {
let numbersFind = [];
for (var i = 0; i < sudoku.length; i++) {
const arrayH = sudoku[i];
for (var j = 0; j < arrayH.length; j++) {
if (numbersFind.includes(arrayH[j])) {
return false;
} else {
numbersFind.push(arrayH[j]);
}
}
numbersFind.length = 0;
}
return true;
}
function isValidVertical(sudoku) {
let numbersFind = [];
let pos = 0;
for (var i = 0; i < sudoku[0].length; i++) {
for (var j = 0; j < sudoku.length; j++) {
if (numbersFind.includes(sudoku[j][pos])) {
return false;
} else {
numbersFind.push(sudoku[j][pos]);
}
}
numbersFind.length = 0;
pos = 0;
}
return true;
}
函数水平有效(数独){
让numbersFind=[];
for(var i=0;i
这里有一个仅适用于水平和垂直方向的小解决方案:
function isValidHorizontal(sudoku) {
let numbersFind = [];
for (var i = 0; i < sudoku.length; i++) {
const arrayH = sudoku[i];
for (var j = 0; j < arrayH.length; j++) {
if (numbersFind.includes(arrayH[j])) {
return false;
} else {
numbersFind.push(arrayH[j]);
}
}
numbersFind.length = 0;
}
return true;
}
function isValidVertical(sudoku) {
let numbersFind = [];
let pos = 0;
for (var i = 0; i < sudoku[0].length; i++) {
for (var j = 0; j < sudoku.length; j++) {
if (numbersFind.includes(sudoku[j][pos])) {
return false;
} else {
numbersFind.push(sudoku[j][pos]);
}
}
numbersFind.length = 0;
pos = 0;
}
return true;
}
函数水平有效(数独){
让numbersFind=[];
for(var i=0;i
这里有一个验证X轴和Y轴的解决方案。
这是一个非常有趣的练习,检查平方组将花费更多的时间,我稍后会尝试。
const invalidBoard=[
[ 5, 3, 4, 6, 7, 9, 8, 1, 2 ],
[ 6, 7, 2, 1, 9, 5, 3, 4, 7 ],
[ 6, 9, 8, 3, 4, 2, 7, 6, 5 ],
[ 8, 5, 9, 7, 6, 1, 4, 2, 1 ],
[ 4, 2, 6, 8, 5, 3, 7, 8, 1 ],
[ 7, 1, 3, 9, 2, 4, 8, 5, 6 ],
[ 9, 6, 1, 5, 3, 7, 2, 8, 4 ],
[ 2, 8, 7, 4, 1, 9, 6, 3, 5 ],
[ 3, 4, 5, 2, 8, 6, 1, 8, 8 ],
];
常数有效板=[
[ 5, 3, 4, 6, 7, 8, 9, 1, 2 ],
[ 6, 7, 2, 1, 9, 5, 3, 4, 8 ],
[ 1, 9, 8, 3, 4, 2, 5, 6, 7 ],
[ 8, 5, 9, 7, 6, 1, 4, 2, 3 ],
[ 4, 2, 6, 8, 5, 3, 7, 9, 1 ],
[ 7, 1, 3, 9, 2, 4, 8, 5, 6 ],
[ 9, 6, 1, 5, 3, 7, 2, 8, 4 ],
[ 2, 8, 7, 4, 1, 9, 6, 3, 5 ],
[ 3, 4, 5, 2, 8, 6, 1, 7, 9 ],
];
const validate_axis=数据=>{
常数=新集合(数据)
返回[…\S].length==data.length
}
const validate=board=>{
const X_VALID=board.every(验证_轴)
常数Y_有效=(
板
.map((_,i)=>board.map(r=>r[i]))
.每个(验证_轴)
)
返回X\u VALID&&Y\u VALID
}
const invalid=验证(invalidBoard)
常量有效=验证(有效板)
console.log(无效)
console.log(有效)
这里有一个验证X轴和Y轴的解决方案。
这是一个非常有趣的练习,检查平方组将花费更多的时间,我稍后会尝试。
const invalidBoard=[
[ 5, 3, 4, 6, 7, 9, 8, 1, 2 ],
[ 6, 7, 2, 1, 9, 5, 3, 4, 7 ],
[ 6, 9, 8, 3, 4, 2, 7, 6, 5 ],
[ 8, 5, 9, 7, 6, 1, 4, 2, 1 ],
[ 4, 2, 6, 8, 5, 3, 7, 8, 1 ],
[ 7, 1, 3, 9, 2, 4, 8, 5, 6 ],
[ 9, 6, 1, 5, 3, 7, 2, 8, 4 ],
[ 2, 8, 7, 4, 1, 9, 6, 3, 5 ],
[ 3, 4, 5, 2, 8, 6, 1, 8, 8 ],
];
常数有效板=[
[ 5, 3, 4, 6, 7, 8, 9, 1, 2 ],
[ 6, 7, 2, 1, 9, 5, 3, 4, 8 ],
[ 1, 9, 8, 3, 4, 2, 5, 6, 7 ],
[ 8, 5, 9, 7, 6, 1, 4, 2, 3 ],
[ 4, 2, 6, 8, 5, 3, 7, 9, 1 ],
[ 7, 1, 3, 9, 2, 4, 8, 5, 6 ],
[ 9, 6, 1, 5, 3, 7, 2, 8, 4 ],
[ 2, 8, 7, 4, 1, 9, 6, 3, 5 ],
[ 3, 4, 5, 2, 8, 6, 1, 7, 9 ],
];
const validate_axis=数据=>{
常数=新集合(数据)
返回[…\S].length==data.length
}
const validate=board=>{
const X_VALID=board.every(验证_轴)
常数Y_有效=(
板
.map((_,i)=>board.map(r=>r[i]))
.每个(验证_轴)
)
返回X\u VALID&&Y\u VALID
}
const invalid=验证(invalidBoard)
常量有效=验证(有效板)
console.log(无效)
log(valid)
这是我的方法,首先检查所有行,然后将col重新排列为行,并使用行验证器和do验证它
const invalidBoard = [
[5, 3, 4, 6, 7, 9, 8, 1, 2],
[6, 7, 2, 1, 9, 5, 3, 4, 7],
[6, 9, 8, 3, 4, 2, 7, 6, 5],
[8, 5, 9, 7, 6, 1, 4, 2, 1],
[4, 2, 6, 8, 5, 3, 7, 8, 1],
[7, 1, 3, 9, 2, 4, 8, 5, 6],
[9, 6, 1, 5, 3, 7, 2, 8, 4],
[2, 8, 7, 4, 1, 9, 6, 3, 5],
[3, 4, 5, 2, 8, 6, 1, 8, 8]
];
const validBoard = [
[5, 3, 4, 6, 7, 8, 9, 1, 2],
[6, 7, 2, 1, 9, 5, 3, 4, 8],
[1, 9, 8, 3, 4, 2, 5, 6, 7],
[8, 5, 9, 7, 6, 1, 4, 2, 3],
[4, 2, 6, 8, 5, 3, 7, 9, 1],
[7, 1, 3, 9, 2, 4, 8, 5, 6],
[9, 6, 1, 5, 3, 7, 2, 8, 4],
[2, 8, 7, 4, 1, 9, 6, 3, 5],
[3, 4, 5, 2, 8, 6, 1, 7, 9]
];
function validateRows(arr) {
let isValid = true;
arr.forEach(row => {
let rowCopy = [...row];
rowCopy.sort();
rowCopy.forEach((number, index) => {
if (number !== index + 1) {
isValid = false;
}
});
});
return isValid;
}
function colsToRows(arr) {
let ret = [];
arr.forEach(row => {
row.forEach((number, index) => {
if (!Array.isArray(ret[index])) {
ret[index] = [];
}
ret[index].push(number);
});
});
return ret;
}
function blocksToRows(arr) {
let blocks = [];
let ret = [];
for (let h = 0; h < 3; h++) {
arr.forEach(row => {
for (let i = 0; i < 3; i++) {
blocks.push(row.shift());
}
});
}
for (let j = 0; j < 9; j++) {
for (let k = 0; k < 9; k++) {
if (!Array.isArray(ret[j])) {
ret[j] = [];
}
ret[j].push(blocks.shift());
}
}
return ret;
}
console.log(validateRows(invalidBoard));
console.log(validateRows(colsToRows(invalidBoard)));
console.log(validateRows(blocksToRows(invalidBoard)));
console.log(validateRows(validBoard));
console.log(validateRows(colsToRows(validBoard)));
console.log(validateRows(blocksToRows(validBoard)));
false
false
false
true
true
true