60行代码教你解决9*9数独游戏

今天我们来讲讲数独吧!失败率几乎为零,不会卡顿的方法,而且万能(指的是对于7 * 7,8 * 8 , 9 * 9, 10 * 10 等等)

先看效果!
在这里插入图片描述

一、思路

数独的规则 行和列不能有相同的数字,然后把方格填满就完了。游戏格子大概就是这个样子。
在这里插入图片描述
首先我们先来讲一下思路,每一个格子都可以输入数字,在没有数字的格子里随机生成数字,但又不可和当前格子的列与行相同。

那么核心的就是如何不与同列同行的相同了。先看图

在这里插入图片描述
仔细想一想,计算机生成是由规例的,每一个数字都是有四个方向的,前后左右,但是计算机是依次生成的,所以这个数字,的下方,和右方是没有数字的,所以就无须和他们做对比。见下图

在这里插入图片描述
那么我们只需要得到,需要判断的这个数值的上放的左方的所有值,然后产生一个随机数,在他们中查找,如果查找的到,就然随机数再次随机,如果查找不到,就把值写入。思路有了,那么写起来就简单了。

二、html准备代码

我们可以输入值那么就少不了输入框

<!DOCTYPE html>
<html lang="zh-CN">
    <head>
        <title></title>
        <meta charset="UTF-8">
        <style>
            *{
                margin:0;padding:0;
            }
            div{
                width: 50px;
                height: 50px;
                float: left;

            }
            input{
                width: 100%;
                height: 100%;
                text-align: center;
                font-size: 1.5em;
                font-weight: bold;
            }
            header::after{
                content:"";
                clear: both;
                display: block;
            }
        </style>
    </head>
    <body>
        <header>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
        </header>
        <header>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
        </header>
        <header>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
        </header>
        <header>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
        </header>
        <header>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
        </header>
        <header>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
        </header>
        <header>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
        </header>
        <header>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
        </header>
        <header>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
            <div><input type="text" value=""></div>
        </header> 
        <button>提交</button>  
    </body>
</html>

html代码比较简单就没有可讲的了。

目前效果

在这里插入图片描述

三、js代码

我们先获取所有的div

window.onload=function(){
    var headers=document.querySelectorAll('header');///获取列
    var hx=0,dx=0;
    var divlist=[];
    while(hx<headers.length){
        let  divs=headers[hx].children;	//获取列里的div
        divlist.push(new Array());		//自动添加数组
        while(dx<divs.length){
                divlist[hx].push(divs[dx])	//往数组传值
            dx++;
        }
        dx=0;
        hx++;
    }
    console.log(divlist)
}

在这里插入图片描述
接下里我们只需要获取当前需要计算并填值的div,和它上面的div,左边的div。

....
    getdiv(headers.length,hx,dx+1)	//因为值0不执行所以加1
....
    function getdiv(length,hx1,dx1){
        let newdiv=[];
            while(dx1){
                newdiv.push(divlist[hx1][dx1-1]);	//获取前面的div
                while(length){  //从最大的列开始获取
                    if((length-1)<hx1){	//获取需要计算上面的div
                        newdiv.push(divlist[length-1][dx1-1])
                    }
                    length--
                }
                dx1--
            }
    }

在这里插入图片描述
可见我们行列已经获取好了,最后只用作比较往里面写入值就好了

核心代码

....       
        calcnum(newdiv,values)
....
function calcnum(nubs,vallist){
    let idx=0;
    nubs.forEach((val)=>{	 //得到不为空的数值
            if(val.children[0].value){
                vallist.push(val.children[0].value)
            }
        })
    while(idx<nubs.length){
        if(!nubs[idx].children[0].value){
           for(var i=0;i<100;i++){		//这个循环写入值就退出了不浪费资源
                let rad=Math.ceil(Math.random()*9) //产生随机数
                if(!~vallist.indexOf(String(rad))){	 
                //没有查找到写入值并且记录
                    vallist.unshift(String(rad))
                    nubs[idx].children[0].value=rad;
                    break;
                }
            }
        }
        idx++;
    }

}

我们已经可以看见结果了,空的地方是因为,电脑把自己给玩死了,这个位置已经不可写入任何值了,那么我们怎么解决了

1、这就要依靠电脑的计算能力了,只要电脑死了就重新刷数值。这招比较万能

2、先写入一部分数值,减少死亡概率
在这里插入图片描述

var input=document.querySelectorAll('input');
input.forEach((val)=>{
    if(!val.value){
        input.forEach((val)=>{
            val.value="";
        })
        window.onload();
    }
})

好了几句话解决

在这里插入图片描述
保证你每次出现的数字都不一样

哦对了忘记了,用户还可自己输入值,那就把数值加到记录字符串就好了,我就一起加到完整代码里了

四、完整代码

<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <title></title>
    <meta charset="UTF-8">
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        div {
            width: 50px;
            height: 50px;
            float: left;

        }

        input {
            width: 100%;
            height: 100%;
            text-align: center;
            font-size: 1.5em;
            font-weight: bold;
        }

        header::after {
            content: "";
            clear: both;
            display: block;
        }
    </style>
    <script>
        window.onload = function () {
          var but=document.querySelector('button').onclick=function(){
                var headers = document.querySelectorAll('header');
                var hx = 0, dx = 0;
                var divlist = [];
                var count=[]
                while (hx < headers.length) {
                    let divs = headers[hx].children;
                    divlist.push(new Array());
                    while (dx < divs.length) {
                        divlist[hx].push(divs[dx]);
                        if(divs[dx].children[0].value){
                            count.unshift((hx*9)+dx)
                            count.unshift(divs[dx].children[0].value)
                        }
                        getdiv(headers.length, hx, dx + 1)
                        dx++;
                    }
                    dx = 0;
                    hx++;
                }
                function getdiv(length, hx1, dx1) {
                    let newdiv = [], values = [];

                    while (dx1) {
                        newdiv.push(divlist[hx1][dx1 - 1]);
                        while (length) {
                            if ((length - 1) < hx1) {
                                newdiv.push(divlist[length - 1][dx1 - 1])
                            }
                            length--
                        }
                        dx1--
                    }

                    calcnum(newdiv, values)
                }
                function calcnum(nubs, vallist) {
                    let idx = 0;
                    nubs.forEach((val) => {
                        if (val.children[0].value) {
                            vallist.push(val.children[0].value)
                        }
                    })
                    while (idx < nubs.length) {
                        if (!nubs[idx].children[0].value) {
                            for (var i = 0; i < 100; i++) {
                                let rad = Math.ceil(Math.random() * 9)
                                if (!~vallist.indexOf(String(rad))) {
                                    vallist.unshift(String(rad))
                                    nubs[idx].children[0].value = rad;
                                    break;
                                }
                            }
                        }
                        idx++;
                    }
                }
            var input=document.querySelectorAll('input');
            input.forEach((val)=>{
                if(!val.value){
                    input.forEach((val)=>{	//从新运算
                        val.value=""
                    })
                    for(var i=0;i<count.length;i+=2){	//填入已有的数值
                        input[count[i]].value=count[i+1]
                    }
                    but()	//从新运算
                }
            })

         }
        }
    </script>
</head>

<body>
    <header>
        <div><input type="text" value="1"></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
    </header>
    <header>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
    </header>
    <header>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
    </header>
    <header>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
    </header>
    <header>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
    </header>
    <header>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
    </header>
    <header>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
    </header>
    <header>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
    </header>
    <header>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
        <div><input type="text" value=""></div>
    </header>
    <button>提交</button>
</body>

</html>

当然我这只是最普通的一种办法,相信你们一定可以写的更加简介,更加的有效率 😊

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数独问题是一种经典的求解问题,回溯法是其中一种常用的算法。下面是用Java实现数独问题的回溯法: ```java public class SudokuSolver { private int[][] board; private static final int EMPTY = 0; private static final int SIZE = 9; public SudokuSolver(int[][] board) { this.board = new int[SIZE][SIZE]; for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { this.board[i][j] = board[i][j]; } } } public boolean solve() { int row = -1; int col = -1; boolean isEmpty = true; // 找到第一个空格 for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { if (board[i][j] == EMPTY) { row = i; col = j; isEmpty = false; break; } } if (!isEmpty) { break; } } // 如果没有空格了,则数独已经解决 if (isEmpty) { return true; } // 尝试填充数字 for (int num = 1; num <= SIZE; num++) { if (isValid(row, col, num)) { board[row][col] = num; if (solve()) { return true; } board[row][col] = EMPTY; } } return false; } // 检查当前数字是否有效 private boolean isValid(int row, int col, int num) { for (int i = 0; i < SIZE; i++) { if (board[row][i] == num) { return false; } if (board[i][col] == num) { return false; } int rowOffset = 3 * (row / 3); int colOffset = 3 * (col / 3); if (board[rowOffset + (i / 3)][colOffset + (i % 3)] == num) { return false; } } return true; } public void print() { for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { System.out.print(board[i][j] + " "); } System.out.println(); } } public static void main(String[] args) { int[][] board = new int[][] { {8, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 3, 6, 0, 0, 0, 0, 0}, {0, 7, 0, 0, 9, 0, 2, 0, 0}, {0, 5, 0, 0, 0, 7, 0, 0, 0}, {0, 0, 0, 0, 4, 5, 7, 0, 0}, {0, 0, 0, 1, 0, 0, 0, 3, 0}, {0, 0, 1, 0, 0, 0, 0, 6, 8}, {0, 0, 8, 5, 0, 0, 0, 1, 0}, {0, 9, 0, 0, 0, 0, 4, 0, 0} }; SudokuSolver solver = new SudokuSolver(board); solver.solve(); solver.print(); } } ``` 在上面的代码中,我们定义了一个`SudokuSolver`类,其中包含了一个9x9的数独矩阵`board`。`solve()`方法通过回溯法来解决数独问题,`isValid()`方法用来检查当前数字是否有效,`print()`方法用来输出结果。 在`main()`方法中,我们定义了一个数独矩阵,并将其传递给`SudokuSolver`类来解决。最后输出结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值