美文网首页
自动解数独

自动解数独

作者: ape_caesar | 来源:发表于2019-03-22 22:13 被阅读0次

直接上代码

/* 编写一个程序,通过已填充的空格来解决数独问题。

一个数独的解法需遵循如下规则:

数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
空白格用 '.' 表示。 */

// 两个样本
// const data = [
//     ['5', '3', '.', '.', '7', '.', '.', '.', '.'],
//     ['6', '.', '.', '1', '9', '5', '.', '.', '.'],
//     ['.', '9', '8', '.', '.', '.', '.', '6', '.'],
//     ['8', '.', '.', '.', '6', '.', '.', '.', '3'],
//     ['4', '.', '.', '8', '.', '3', '.', '.', '1'],
//     ['7', '.', '.', '.', '2', '.', '.', '.', '6'],
//     ['.', '6', '.', '.', '.', '.', '2', '8', '.'],
//     ['.', '.', '.', '4', '1', '9', '.', '.', '5'],
//     ['.', '.', '.', '.', '8', '.', '.', '7', '9'],
// ]
const data =[
    [".",".","9","7","4","8",".",".","."],
    ["7",".",".",".",".",".",".",".","."],
    [".","2",".","1",".","9",".",".","."],
    [".",".","7",".",".",".","2","4","."],
    [".","6","4",".","1",".","5","9","."],
    [".","9","8",".",".",".","3",".","."],
    [".",".",".","8",".","3",".","2","."],
    [".",".",".",".",".",".",".",".","6"],
    [".",".",".","2","7","5","9",".","."]
]
// 启动函数
function solction(board) {
    let finalResult = {return: undefined};
    fullfillTable(board, finalResult);
    console.log(finalResult)
}
// 填字函数
function fullfillTable(board, finalResult) {
    // 候选人数组
    let candidate = new Array(9);
    // 当前处理的位置
    let x = -1;
    let y = -1;
    // 还有没有空位(tip: 还有空, 但是缺找不到地方能填字,说明之前有填错了,就放弃这个分支)
    let zeroCount = 0;
    // 扫描一遍空格, 找出最好填的那个
    for (let i = 0; i < board.length; i++) {
        for (let j = 0; j < board.length; j++) {
            if (board[i][j] === '.') {
                zeroCount++
                const temp = getCandidate(board, i, j);
                if (temp.length < candidate.length && temp.length!==0) {
                    candidate = temp
                    x = i
                    y = j
                }
            }
        }
    }
    // 找到了可以填的
    if (x !== -1 && y !== -1) {
        // 如果只有一个候选的,那就填那个数字
        if (candidate.length === 1) {
            board[x][y] = candidate[0]
        // 多个的就需要用多多递归了
        } else {
            // 这里开启了多个分支
            for (let i = 0; i<candidate.length; i++) {
                const newBoard = new Array(board.length);
                for (let i = 0; i < board.length; i++) {
                    newBoard[i] = new Array(board.length)
                }
                for (let i = 0; i < board.length; i++) {
                    for (let j = 0; j < board.length; j++) {
                        newBoard[i][j] = board[i][j]
                    }
                }
                newBoard[x][y] = candidate[i]
                fullfillTable(newBoard, finalResult)
            }
            return;
        }
    } else if(zeroCount > 0) {
        return false;
    }
    // 还有空就继续递归
    if (zeroCount > 0) {
        console.log(x,y)
        console.log(candidate)
        fullfillTable(board, finalResult)
    } else {
        // 已经完成了
        finalResult.return = board;
    }
}
// 根据数独的规则找出 最好填的那个数,或者多个数
function getCandidate(board, x, y) {
    const queue = new Array(board.length).fill(0);
    for (let i = 0; i < board.length; i++) {
        if (board[x][i] !== '.') {
            queue[+board[x][i] - 1] = queue[+board[x][i] - 1]? queue[+board[x][i] - 1] : board[x][i]
        }
        if (board[i][y] !== '.')
            queue[+board[i][y] - 1] = queue[+board[i][y] - 1]? queue[+board[i][y] - 1] : board[i][y]
    }
    const startX = x - x % 3;
    const startY = y - y % 3;
    for (let i = startX; i < startX + 3; i++) {
        for (let j = startY; j < startY + 3; j++) {
            if (board[i][j] !== '.') {
                queue[+board[i][j] - 1] = queue[+board[i][j] - 1]? queue[+board[i][j] - 1] : board[i][j];
            }
        }
    }
    const returnData = [];
    queue.forEach((item, index) => {
        if (item === 0) {
            returnData.push((index+1).toString())
        }
    })
    return returnData
}
// console.log(getCandidate(data, 7,7))
solction(data);
// console.log(data)

相关文章

  • 自动解数独

    直接上代码

  • 解数独

    编写一个程序,通过已填充的空格来解决数独问题。 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次...

  • python实现自动解数独小程序

    跟朋友最近聊起来数独游戏,突发奇想使用python编写一个自动计算数独解的小程序。 数独的规则不再过多阐述,在此描...

  • 解数独算法

    昨天在Ubuntu18.04上打开自带的数独游戏,宿舍几个人一起玩了很久,今天整理了一下玩的过程,研究出算法并写成...

  • 解数独(sudouku)

    C++实现 实例 “芬兰数学家因卡拉花费3个月设计出了世界上迄今难度最大的数独游戏,而且它只有一个答案。因卡拉说只...

  • kotlin解数独

    kotlin 解数独,“容易”、“初级”均已解开,“高级”尚未测试,“高级+”没解开 数独链接:https://w...

  • 8个步骤教你用Python解数独!(内含源码)

    前言 利用Python来解数独~~~起因大概是:自己解数独实在是太费劲了!!! 代码效果展示 所需工具 pytho...

  • C++解数独

    大概是把网上找到的代码稍微改了一下,记不清了= = 代码 测试用例 1 0 3 0 0 0 5 0 90 0 2 ...

  • Python 解数独(Sudoku)

    闲来有了用python解数独的想法,但由于对复杂些的算法仍是一窍不通,最终算是用简单算法实现了出来。 相关简介: ...

  • 巧解数独题

    最近,在我们 XXX 中心小学的“数学新思维”兴趣班上,我学到了一种新的数学游戏——数独。我觉得很好玩,爸爸就给我...

网友评论

      本文标题:自动解数独

      本文链接:https://www.haomeiwen.com/subject/oludvqtx.html