// On load handling var prevOnLoad = window.onload puzzle = [ [0, 0, 0, 0, 0, 0, 0, -3, 0], [-8, 0, 0, 0, 0, 0, -6, 0, -2], [-5, -1, -3, 0, -2, 0, -4, 0, -9], [0, 0, -7, 0, -8, -4, -1, 0, 0], [-9, -4, -5, 0, -1, 0, -8, -6, -3], [0, 0, -6, -5, -3, 0, 7, 0, 0], [-4, 0, -8, 0, -7, 0, -9, -1, -6], [-2, 0, -9, 0, 0, 0, 0, 0, -8], [0, -3, 0, 0, 0, 0, 0, 0, 0]] var gridSize = 0 var solving = false var Sudoku = { init: function(n) { this.p = new Array(n) for (var row = 0; row < this.p.length; row++) { this.p[row] = new Array(n) } }, loadGrid: function(p) { }, loadFromGrid: function() { for (var row = 0; row < this.p.length; row++) { for (var col = 0; col < this.p.length; col++) { var v = document.getElementById("n_"+row+"_"+col).value if (v == "") this.p[row][col] = 0 else this.p[row][col] = v } } this.sqrSz = 3 }, clear: function() { for (var row = 0; row < this.p.length; row++) { for (var col = 0; col < this.p.length; col++) { if (this.p[row][col] > 0) this.p[row][col] = 0 } } }, set: function(row, col, num) { this.p[row][col] = num //var c = "c_"+row+"_"+col //$(c).innerHTML = this.p[row][col] == 0 ? " " : //(""+Math.abs(this.p[row][col])+"") }, solve: function() { return this.solveCell(0, 0) }, solveCell: function (row, col) { if (col >= this.p.length) { return true } else if (row >= this.p.length) { return this.solveCell(0, col+1) } else if (this.p[row][col] != 0) { return this.solveCell(row+1, col) } for (var num=1; num <= this.p.length; num++) { if (this.valid(row, col, num)) { this.set(row, col, num) if (this.solveCell(row+1, col)) { return true } } } this.set(row, col, 0) return false }, valid: function(row, col, num) { var isValid = this.validInRow(row, num) && this.validInCol(col, num) && this.validInSquare(row, col, num) return isValid }, validInRow: function(row, num) { for (var col=0; col < this.p.length; col++) { if (Math.abs(this.p[row][col]) == num) return false } return true }, validInCol: function(col, num) { for (var row=0; row < this.p.length; row++) { if (Math.abs(this.p[row][col]) == num) return false } return true }, validInSquare: function(row, col, num) { var r1 = Math.floor(row / this.sqrSz) * this.sqrSz var c1 = Math.floor(col / this.sqrSz) * this.sqrSz for (var r=r1; r < r1+this.sqrSz; r++) { for (var c=c1; c < c1+this.sqrSz; c++) { if (Math.abs(this.p[r][c]) == num) return false } } return true }, putCell: function(row, col, val) { var c = "c_"+row+"_"+col var n = "n_"+row+"_"+col document.getElementById("n_"+row+"_"+col).value = (val==0?"":Math.abs(val)) }, put: function() { for (var row = 0; row < this.p.length; row++) { for (var col = 0; col < this.p.length; col++) { this.putCell(row, col,this.p[row][col]) } } } } function changedCell(row, col, val) { if ($('playing').checked) { //alert(n) Sudoku.loadFromGrid() if (!Sudoku.solve()) { var n = "n_"+row+"_"+col //$(n).value = "" //$(n).focus() alert("Bad move") $(n).select() } } } function play() { solving } function createCell(row, col, val) { var c = "c_"+row+"_"+col var n = "n_"+row+"_"+col $(c).innerHTML = '' } function createGrid(n) { gridSize = n for (var row = 0; row < n; row++) { for (var col = 0; col < n; col++) { createCell(row, col, "") } } } function setCell(row, col, val) { var n = "n_"+row+"_"+col document.getElementById(n).value = (val==0?"":Math.abs(val)) } function setGrid(p) { for (var row = 0; row < p.length; row++) { for (var col = 0; col < p.length; col++) { setCell(row, col, p[row][col]) } } } function clearGrid() { for (var row = 0; row < gridSize; row++) { for (var col = 0; col < gridSize; col++) { setCell(row, col, "") } } } function onLoad(e) { createGrid(puzzle.length) setGrid(puzzle) Sudoku.init(puzzle.length) } function solvePuzzle() { Sudoku.loadFromGrid() if (Sudoku.solve() == true) { Sudoku.put() } else { alert("The puzzle cannot be solved") } } function loadSample() { setGrid(puzzle) } window.onload = onLoad