码迷,mamicode.com
首页 > Web开发 > 详细

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

时间:2018-02-05 20:12:59      阅读:414      评论:0      收藏:0      [点我收藏+]

标签:不可   dom   body   time   new   function   random   cti   版本   

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版本)

标签:不可   dom   body   time   new   function   random   cti   版本   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!