千万不要随便填数字,无解的题可能会卡死
想体验卡死的可以在前两个编辑框都写上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
2 条评论
哇哇哇,这个就很棒了!收藏~
⌇●﹏●⌇瑟瑟发抖