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

Posted 花兮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用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();//有时陷入死循环 还没有解决 所以加了执行时间限制 防止死循环

 

以上是关于用js遍历生成数独可行数据(未优化 有bug版本)的主要内容,如果未能解决你的问题,请参考以下文章

优化回溯算法求解数独

由于未清除缓存引发的bug

团队作业9——测试与发布(Beta版本)

记录一次快速注册接口的优化

150+行Python代码实现带界面的数独游戏

bug狩猎