数独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