随机生成《数独》二维数组= =

2020-11-06 16:33:27 +08:00
 vitozyf
function getSudokuItem(params) {
    const sudokuItem = []
    while (sudokuItem.length < 9) {
        let num =parseInt(Math.random() * 9 + 1,10)
        while (sudokuItem.includes(num)) {
            num =parseInt(Math.random() * 9 + 1,10)
        }
        sudokuItem.push(num)
    }
    return sudokuItem
}
function getSudokuData(params) {
    const sudokuData = [];
    while (sudokuData.length < 9) {
        let item = getSudokuItem()
        function getExisted() {
            item = getSudokuItem()
            let existed = false
            for (let i = 0; i < 9; i++) {
                if (sudokuData.map(a => a[i]).includes(item[i])) {
                    existed = true;
                    break
                }
            }
            const s = [1,4,7], t = [2,5,8], i = sudokuData.length
            if (s.includes(i)) {
                const flag0 = sudokuData[i - 1].filter((d, j) => j < 3).find(a => a === item[0]  || a === item[1] || a === item[2])
                const flag1 = sudokuData[i - 1].filter((d, j) => j < 6 && j >= 3).find(a => a === item[3]  || a === item[4] || a === item[5])
                const flag2 = sudokuData[i - 1].filter((d, j) => j < 9 && j >= 6).find(a => a === item[6]  || a === item[7] || a === item[8])
                if (flag0 || flag1 || flag2) {
                    existed = true;
                }
            }
            if (t.includes(i)) {
                const flag0 = sudokuData[i - 2].filter((d, j) => j < 3).concat(sudokuData[i - 1].filter((d, j) => j < 3)).find(a => a === item[0]  || a === item[1] || a === item[2])
                const flag1 = sudokuData[i - 2].filter((d, j) => j < 6 && j >= 3).concat(sudokuData[i - 1].filter((d, j) => j < 6 && j >= 3)).find(a => a === item[3]  || a === item[4] || a === item[5])
                const flag2 = sudokuData[i - 2].filter((d, j) => j < 9 && j >= 6).concat(sudokuData[i - 1].filter((d, j) => j < 9 && j >= 6)).find(a => a === item[6]  || a === item[7] || a === item[8])
                if (flag0 || flag1 || flag2) {
                    existed = true;
                }
            }
            return existed
        }
        while(getExisted()) {}
        sudokuData.push(item)
    }
    return sudokuData
}
console.table(getSudokuData())

打开浏览器控制台,复制执行查看结果 = =

716 次点击
所在节点    程序员
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/722461

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX