用js遍历生成数独可行数据(未优化 有bug版本)

var chess;
var start;
var end;
//创建棋盘
function creatChess()
{
    chess = new Array();
    for (var i = 0; i < 9; i++)
    {
        chess[i] = new Array();
        for (var j = 0; j < 9; j++)
        {
            chess[i][j] = 0;
        }
    }
}

//打印棋盘
function printChess()
{
    var say = "";
    for (var i = 0; i < 9; i++)
    {
        for (var j = 0; j < 9; j++)
        {
            say += chess[i][j];
        }
        say += ‘\n‘;
    }
    console.log(say);
}

//检测横冲突
function checkRow(r,c)
{
    for (var i = 0; i < 9; i++)
    {
        if(i == c)
        {
            continue;//同一个格子跳过
        }
        if (chess[r][i] == chess[r][c])
        {
            return false;//冲突
        }
    }
    return true;//没有冲突
}

//检测列冲突
function checkCol(r,c)
{
    for (var i = 0; i < 9; i++)
    {
        if(i == r)
        {
            continue;//同一个格子跳过
        }
        if(chess[i][c] == chess[r][c])
        {
            return false;//冲突
        }
    }
    return true;//没有冲突
}

//检测小块九宫格冲突
function checkArea(r,c)
{
    var left = Math.floor(r/3)*3;
    var top = Math.floor(c/3)*3;
    for (var i = left; i < left+3; i++)
    {
        for (var j = top; j < top+3; j++)
        {
            if (i == r && j == c)
            {
                continue;//同一个格子跳过
            }
            if (chess[i][j] == chess[r][c])
            {
                return false;//冲突
            }
        }
    }
    return true;//没有冲突
}

//获取一个1-9的随机数字
function getRandom()
{
    return Math.floor(Math.random()*9+1);
}

//检测正确性
function checkOk(r,c)
{
    return (checkRow(r,c) && checkCol(r,c) && checkArea(r,c))?true:false;
}

//初始化棋盘
function chessInit()
{
    start = new Date().getTime();
    for (var i = 0; i < 9; i++)
    {
        var count = 0;
        for (var j = 0; j < 9; j++)
        {
            end = new Date().getTime();
            if (end - start > 500)
            {
                console.log(‘500 ms timeout!\n‘);
                return;
            }
            if (count == 0) chess[i][j] = getRandom();//第一次进入随机数字
            if (count > 0)
            {
                chess[i][j]++;//第二次进入自增
                if (chess[i][j] == 10)
                {
                    chess[i][j] = 1;//归1
                }
            }
            if (count == 9) chess[i][j] = 0;//1-9都不可行后编著为0 开始回溯
            if (chess[i][j] == 0)
            {
                if (j > 0)
                {
                    //不是第一列 回溯上一列
                    j -= 2;
                    continue;
                }
                else
                {
                    //第一列 回溯上一行最后一列
                    i--;
                    j = 8;
                    continue;
                }
            }
            //检查是否可行
            if (checkOk(i, j))
            {
                count = 0;//可行 重置计数器
            }
            else
            {
                count++;// 计数器加1
                j--;// 继续
            }
        }
    }
}

//初始化
function chess()
{
    creatChess();//创建棋盘
    chessInit();//初始化棋盘
    printChess();//打印棋盘
}

chess();//有时陷入死循环 还没有解决 所以加了执行时间限制 防止死循环

原文地址:https://www.cnblogs.com/godehi/p/8418882.html

时间: 2024-10-09 19:46:37

用js遍历生成数独可行数据(未优化 有bug版本)的相关文章

Python+Mysql生成zabbix统计数据(优化)

周末重新整理了一下,把有些不合理的地方改了下,自我感觉好多了 ZabbixReport.py #!/usr/bin/python #coding:utf-8 import MySQLdb import time,datetime #zabbix数据库信息: zdbhost = '192.168.1.100' zdbuser = 'zabbix' zdbpass = 'zabbixreport' zdbport = 3306 zdbname = 'zabbix' #生成文件名称: xlsfilen

js遍历table中的数据,并组装成json

1 function fore(){ 2 var temp = ""; 3 var tabLen = document.getElementById("tableID"); 4 var jsonT = "{pieTes:["; 5 for(var i = 0; i < tabLen.rows.length;i++){ 6 for(var j = 0;j<tabLen.rows[i].cells.length;j++){ 7 //tem

js基础例子购物车升级版(未优化版)

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>购物车升级版</title> <style> table{border-collapse: collapse} tr td{ border: 1px solid black; text-align: center; } li{list-style:

js动态生成数据列表

我们通常会使用table标签来展示数据内容,由于需要展示的数据内容是随时更换的,所以不可能将展示的数据列表写死在html写死在页面中,而是需要我们根据后台传来的数据随时更换,这个时候就需要我们使用js来动态生成表格. 首先我们需要先写好页面的样式. html部分 <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; chars

chart.js插件生成折线图时数据普遍较大时Y轴数据不从0开始的解决办法[bubuko.com]

chart.js插件生成折线图时数据普遍较大时Y轴数据不从0开始的解决办法,原文: 默认情况下如下图 Y轴并不是从0开始,这样折现图的幅度会很大,不是正常的幅度,解决办法如下, 示例代码: window.onload = function () { var ctx = document.getElementById("canvas").getContext("2d"); window.myLine = new Chart(ctx).Line(lineChartDat

抓取js动态生成数据

最近在抓数据,一般的网页数据抓取相对容易一些,今天在抓电视猫的节目单,发现有些数据时抓取不到的,Java端得到的HTML文件里面没有某一段代码,查了很多资料,发现说是js动态生成的数据,无法直接抓取,有一种解决方法是利用找到ajax请求地址和参数,重新抓取,该方法存在一个问题,就是当参数被加密过时,该方法就不好用了,所以,这里用了一个办法,就是利用HTMLunit来抓取(可以利用jsuop来处理HTML文件),jar包下载地址:http://download.csdn.net/detail/jo

爬虫案例(js动态生成数据)

需求:爬取https://www.xuexi.cn/f997e76a890b0e5a053c57b19f468436/018d244441062d8916dd472a4c6a0a0b.html页面中的新闻数据. 分析: 1.首先通过分析页面会发现该页面中的新闻数据都是动态加载出来的,并且通过抓包工具抓取数据可以发现动态数据也不是ajax请求获取的动态数据(因为没有捕获到ajax请求的数据包),那么只剩下一种可能,该动态数据是js动态生成的. 2.通过抓包工具查找到底数据是由哪个js请求产生的动态

《Nodejs开发加密货币》之二十六:轻松从Js文件生成UML类图

前言 上一篇<函数式编程入门经典>,罗嗦了很长,很多小伙伴看得云里雾里.这里提供一个实例,让大家切身感受函数式编程的奥妙和趣味.当然,仅仅为了举例而写代码就没有什么意义了,本书提供的例子都是承担了某项任务的具体项目或工具,这个例子自然也不能例外. 本书用到了大量的Uml类图,经常有小伙伴问我用什么工具画的.说实话,前几篇是我个人一点点手工整理的,但后来就感觉在浪费生命,作为程序员,怎么可能容忍这样的事情反复发生.所以,就有了 js2uml(见参考)这个小工具.只不过,当初目的单一,仅仅使用正则

JS动态生成表格后 合并单元格

JS动态生成表格后 合并单元格 最近做项目碰到表格中的单元格合并的问题,需求是这样的,首先发ajax请求 请求回来后的数据 动态生成表格数据,但是生成后如果编号或者(根据其他的内容)有相同时,要合并单元格操作,在做之前也试着google下,但是网上没有碰到这方面的需求,所以自己写了一个简单的.用文字描述需求太费劲了,如下图所示: 1. 没有合并之前的图如下: 2. 合并之后的图如下: 如上所示:是根据相邻的编号相同 进行单元格合并. 先看看实现后的效果再聊吧! JSfiddle链接地址如下: 点