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();
  • 相关阅读:
    如何处理DateTime日期时间格式
    ASP.NET访问域用户(AD活动目录)信息的类
    多层代理取真实IP地址
    自动播放MP3文件
    Windows7 下用 grub4dos 安装 Ubuntu
    javascript判断iphone/android手机横竖屏模式
    C#一个到多个Cookie的字符串添加到CookieCollection集合中【isGood代码】
    css 文本对齐4种方法
    让VirtualBox虚拟机实现开机自动后台运行
    MSXML2, XmlHttpClass基础
  • 原文地址:https://www.cnblogs.com/godehi/p/8418882.html
Copyright © 2011-2022 走看看