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

var chess;//创建棋盘
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()
{for (var i = 0; i < 9; i++)
    {  
        var count = 0;  
        for (var j = 0; j < 9; j++)
        {  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();

 

posted @ 2018-02-05 18:24  花兮  阅读(478)  评论(0编辑  收藏  举报