zoukankan      html  css  js  c++  java
  • 用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 += '
    ';
        }
        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();
  • 相关阅读:
    给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
    11
    实战 迁移学习 VGG19、ResNet50、InceptionV3 实践 猫狗大战 问题
    tx2系统备份与恢复
    如何在Ubuntu 18.04上安装和卸载TeamViewer
    bzoj 3732 Network (kruskal重构树)
    bzoj2152 聪聪可可 (树形dp)
    牛客 216D 消消乐 (二分图最小点覆盖)
    牛客 197E 01串
    Wannafly挑战赛23
  • 原文地址:https://www.cnblogs.com/godehi/p/8418882.html
Copyright © 2011-2022 走看看