Javascript 解數獨

<html>
<head>
<title>sudoku</title>
</head>
<body>
<table>
<tr>
<script>
document.write("<th width=\"22px\"></th>");
for(var i=1;i<=9;i++) document.write("<th width=\"22px\">"+i.toString()+"</th>");
</script>
</tr>
<script>
for(var i=1;i<=9;i++)
{
document.write("<tr><td>"+i.toString()+"</td>");
	for(var j=1;j<=9;j++) document.write("<td><input onfocus=\"this.value='';\" style=\"width:22px\" id="+i.toString()+j.toString()+"></td>");
document.write("</tr>");
}
</script>
</table>
<script>
var fas,hang,lie,jg,gg;
jg = new Array(
new Array(0,0,0,0,0,0,0,0,0,0),
new Array(0,1,1,1,2,2,2,3,3,3),
new Array(0,1,1,1,2,2,2,3,3,3),
new Array(0,1,1,1,2,2,2,3,3,3),
new Array(0,4,4,4,5,5,5,6,6,6),
new Array(0,4,4,4,5,5,5,6,6,6),
new Array(0,4,4,4,5,5,5,6,6,6),
new Array(0,7,7,7,8,8,8,9,9,9),
new Array(0,7,7,7,8,8,8,9,9,9),
new Array(0,7,7,7,8,8,8,9,9,9)
);
function show(str)
{
	document.getElementById("staut").innerHTML=str;
}
function clear()
{
	fas=new Array();
	hang=new Array();
	lie=new Array();
	gg=new Array();
	for(var i=1;i<=9;i++)
	{
		fas[i]=new Array();
		hang[i]=new Array();
		lie[i]=new Array();
		gg[i]=new Array();
		for(var j=1;j<=9;j++)
		{
			fas[i][j]=9;
			hang[i][j]=0;
			gg[i][j]=0;
			lie[i][j]=0;
			if(!document.getElementById(i.toString()+j.toString()).value) document.getElementById(i.toString()+j.toString()).value=0;
			document.getElementById(i.toString()+j.toString()).value=parseInt(document.getElementById(i.toString()+j.toString()).value,10)%10;
		}
	}
}
function add(x,y,z)
{
	var stx=Math.floor((x-1)/3)*3+1;
	var sty=Math.floor((y-1)/3)*3+1;
	for(var i=stx;i<=stx+2;i++)
		for(var j=sty;j<=sty+2;j++)
			if(hang[i][z]==0&&lie[j][z]==0) fas[i][j]--;
	for(var i=1;i<=9;i++) if(jg[i][y]!=jg[x][y]&&hang[i][z]==0) fas[i][y]--;
	for(var i=1;i<=9;i++) if(jg[x][i]!=jg[x][y]&&lie[i][z]==0) fas[x][i]--;
	hang[x][z]=1;
	lie[y][z]=1;
	gg[jg[x][y]][z]=1;
	document.getElementById(x.toString()+y.toString()).value=z;
}
function del(x,y,z)
{
	hang[x][z]=0;
	lie[y][z]=0;
	gg[jg[x][y]][z]=0;
	document.getElementById(x.toString()+y.toString()).value=0;
	var stx=Math.floor((x-1)/3)*3+1;
	var sty=Math.floor((y-1)/3)*3+1;
	for(var i=stx;i<=stx+2;i++)
		for(var j=sty;j<=sty+2;j++)
			if(hang[i][z]==0&&lie[j][z]==0) fas[i][j]++;
	for(var i=1;i<=9;i++) if(jg[i][y]!=jg[x][y]&&hang[i][z]==0) fas[i][y]++;
	for(var i=1;i<=9;i++) if(jg[x][i]!=jg[x][y]&&lie[i][z]==0) fas[x][i]++;

}
function dfs(deep)
{
	if(deep==0) return true;
	var mx=0,my=0,mfas=10;
	for(var i=1;i<=9;i++)
		for(var j=1;j<=9;j++)
			if(document.getElementById(i.toString()+j.toString()).value==0&&fas[i][j]<mfas)
			{
				mx=i;
				my=j;
				mfas=fas[i][j];
			}
	if(mfas==10) return false;
	for(var i=1;i<=9;i++)
	{
		if(hang[mx][i]==0&&lie[my][i]==0&&gg[jg[mx][my]][i]==0)
		{
			add(mx,my,i);
			if(dfs(deep-1)==true) return true;
			del(mx,my,i);
		}
	}
	return false;
}
function solve()
{
	show("solving");
	clear();
	var sl=0;
	var yj=true;
	for(var i=1;i<=9;i++)
		for(var j=1;j<=9;j++)
			if(document.getElementById(i.toString()+j.toString()).value!=0)	
			{
				var vue=document.getElementById(i.toString()+j.toString()).value;
				if(hang[i][vue]!=0||lie[j][vue]!=0||gg[jg[i][j]][vue]!=0) yj=false;
				add(i,j,vue);
			}
			else sl++;
	if(yj&&dfs(sl)) show("Done!");
	else show("No solution");
}
function reset()
{
	for(var i=1;i<=9;i++)
		for(var j=1;j<=9;j++)
			document.getElementById(i.toString()+j.toString()).value=0;
}
</script>
<input type="submit" onclick="solve();"><input type="Reset" onclick="reset();">
<p id="staut"></p>
</body>
</html>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章