千万不要随便填数字,无解的题可能会卡死
想体验卡死的可以在前两个编辑框都写上1试试。



主要代码

//递归函数
function calc_sudoku(t_arr,y=0,x=0)
{
    //临界停止判定
    if(y==8 && x==8)
    {
        if(t_arr[y][x]!=0)
        {
            return t_arr;
        }
        else
        {
            var cal = calc_one(t_arr,y,x);
            for(var i in cal)
            {
                if(cal[i]!=null)
                {
                    t_arr[y][x] = cal[i];
                    return t_arr;
                }
            }
            return false;
        }
    }
    //换行时更新xy的值
    if(x==9)
    {
        y++;
        x=0;
    }
    //当前不为0时继续递归
    if(t_arr[y][x]!=0)
    {
        return calc_sudoku(t_arr,y,x+1)
    }else
    {
        //当前为0,遍历所有可能情况
        var cal = calc_one(t_arr,y,x);
        var now_list = new Array();
        for(var i in cal)
        {
            if(cal[i]!=null)
            {
                for(var o=0;o<9;o++)
                    now_list[o] = t_arr[o].slice();
                now_list[y][x] = cal[i];

                var re = calc_sudoku(now_list,y,x+1);
                if(typeof re=='object')
                    return re;
            }
        }
        return false;
    }
}

//列出所有可能性
function calc_one(y_arr,y,x)
{
    tmp = [null,1,2,3,4,5,6,7,8,9];
    for(var i=0;i<9;i++)
    {
        //按行排除
        tmp[y_arr[y][i]] = null;
        //按列排除
        tmp[y_arr[i][x]] = null;
        //按小宫格排除
        tmp[y_arr[parseInt(y/3)*3+parseInt(i/3)][parseInt(x/3)*3+(i%3)]] = null;
    }
    return tmp;
}

笔记

原生js才是男人的浪漫

//获取表格中的文本框
document.getElementById('table').getElementsByTagName('tr')[a].getElementsByTagName('input')[b]

//转为int类型
parseInt()
//判断类型
typeof var_name

//获取属性
element.getAttribute('data-id')

//获取焦点与选择
element.focus();
element.select();

//js绑定事件
element.addEventListener('click',myFunction);

//js移除事件
element.removeEventListener("click", myFunction)

//js绑定事件兼容写法
var x = document.getElementById("myBtn");
if (x.addEventListener) {                    // 所有主流浏览器,除了 IE 8 及更早版本
    x.addEventListener("click", myFunction);
} else if (x.attachEvent) {                  // IE 8 及更早版本
    x.attachEvent("onclick", myFunction);
}

//js事件列表
http://www.runoob.com/jsref/dom-obj-event.html
最后修改:2020 年 05 月 21 日 11 : 12 PM