V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
vitozyf
V2EX  ›  程序员

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

  •  
  •   vitozyf · 2020-11-06 16:33:27 +08:00 · 689 次点击
    这是一个创建于 1276 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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())
    
    

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

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1610 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 16:29 · PVG 00:29 · LAX 09:29 · JFK 12:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.