You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
185 lines
5.1 KiB
185 lines
5.1 KiB
|
|
window.onload = setup |
|
|
|
var cells_ordered = null |
|
|
|
function setup() { |
|
let table = document.getElementById('sudoku_board') |
|
cells_ordered = table.getElementsByTagName('td') |
|
console.log(cells_ordered.length) |
|
for (let c = 0; c < 81; c++){ |
|
let cell = cells_ordered[c] |
|
cell.addEventListener("keypress",check_cell_content) |
|
cell.setAttribute("contenteditable","") |
|
cell.innerHTML = '<br>' //Moves caret position to vertical center |
|
} |
|
show_all_solutions() |
|
} |
|
|
|
function fill_default() { |
|
$('#message').text('') |
|
publish_board([ |
|
[9,NaN,5,NaN,NaN,NaN,3,NaN,NaN], |
|
[NaN,6,NaN,NaN,NaN,1,NaN,5,NaN], |
|
[3,2,1,9,NaN,NaN,NaN,NaN,NaN], |
|
[NaN,9,2,5,NaN,NaN,4,1,3], |
|
[NaN,5,7,4,NaN,NaN,NaN,NaN,NaN], |
|
[NaN,1,NaN,NaN,NaN,2,NaN,NaN,5], |
|
[NaN,7,NaN,NaN,NaN,9,1,NaN,6], |
|
[NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN], |
|
[NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN] |
|
]) |
|
} |
|
|
|
function clear_board() { |
|
$('#message').text('') |
|
for (let row = 0; row < 9; row++) |
|
for (let column = 0; column < 9; column++) |
|
publish_cell(row, column, NaN) |
|
} |
|
|
|
function check_cell_content(e) { |
|
console.log(e.key) |
|
let content = parseInt(e.key) |
|
console.log(content) |
|
if ((content <= 0) || isNaN(content) || e.target.innerText.trim().length > 0){ |
|
e.preventDefault() |
|
} |
|
} |
|
|
|
function get_data() { |
|
let table = document.getElementById('sudoku_board') |
|
let cells_ordered = table.getElementsByTagName('td') |
|
let sudoku_board = [[],[],[],[],[],[],[],[],[]] |
|
for (let cell = 0;cell<81;cell++){ |
|
let column = cell%9 |
|
let row = Math.floor(cell/9) |
|
let value = parseInt(cells_ordered[cell].textContent.trim()) |
|
sudoku_board[row][column] = value |
|
} |
|
return sudoku_board |
|
} |
|
|
|
function publish_cell(row, column, value) { |
|
cells_ordered[row*9 + column].innerHTML = "" + (isNaN(value) ? "<br>" : value) |
|
} |
|
|
|
function publish_board(board) { |
|
for (let row = 0; row < 9; row++) |
|
for (let column = 0; column < 9; column++) |
|
publish_cell(row, column, board[row][column]) |
|
} |
|
|
|
function set_cell(board, row, column, value) { |
|
board[row][column] = value |
|
publish_cell(row, column, value) |
|
} |
|
|
|
function solve_step(board, cell) { |
|
let column = cell%9 |
|
let row = Math.floor(cell/9) |
|
|
|
if(cell > 80) |
|
return true |
|
|
|
if(!isNaN(board[row][column])) |
|
return solve_step(board, cell + 1) |
|
|
|
for(let nr = 1;nr<=9;nr++) { |
|
if(check_cell(board, row, column, nr)) { |
|
set_cell(board, row, column, nr) |
|
if(solve_step(board, cell + 1)) { |
|
return true; |
|
} else { |
|
set_cell(board, row, column, NaN) |
|
} |
|
} |
|
} |
|
return false |
|
} |
|
|
|
function board_to_string(board) { |
|
let ret = "" |
|
for (let row = 0; row < 9; row++) |
|
for (let column = 0; column < 9; column++) |
|
ret += isNaN(board[row][column]) ? "0" : "" + board[row][column] |
|
return ret |
|
} |
|
|
|
function store_board(board) { |
|
$.ajax({ |
|
url: '/solution', |
|
type: 'POST', |
|
contentType: 'application/json', |
|
data: JSON.stringify({ "Data": board_to_string(board) }), |
|
success: function () { |
|
$('#message').text('Stored solution to database') |
|
show_all_solutions() |
|
}, |
|
error: function () { |
|
$('#message').text('Error on saving the solution to the database.') |
|
} |
|
}) |
|
} |
|
|
|
function solve() { |
|
$('#message').text('') |
|
let board = get_data() |
|
if (!check_board(board)) { |
|
$('#message').text("The numbers on the board are in conflict with the rules of Sudoku") |
|
return |
|
} |
|
|
|
if (!solve_step(board, 0)) { |
|
$('#message').text("Unable to solve this Sudoku") |
|
return |
|
} |
|
|
|
store_board(board) |
|
} |
|
|
|
function show_all_solutions() { |
|
jQuery.get("/solution", function (data) { |
|
new DevExpress.ui.dxDataGrid(document.getElementById("allsolutions"), { |
|
dataSource: data, |
|
columnAutoWidth: true |
|
}); |
|
}).fail(function (e) { console.warn("fetching solution failed: ", e) }) |
|
} |
|
|
|
function check_cell(board, row, col, value) { |
|
// if already present on the column, not acceptable |
|
for (let r = 0; r < 9; ++r) |
|
if (board[r][ col] == value) return false; |
|
|
|
// if already present on the row, not acceptable |
|
for (let c = 0; c < 9; ++c) |
|
if (board[row][ c] == value) return false; |
|
|
|
// if already present in the same 3x3 square, also not acceptable |
|
let r1 = Math.floor(row / 3) * 3; |
|
let c1 = Math.floor(col / 3) * 3; |
|
for (let r = r1; r < r1 + 3; ++r) { |
|
for (let c = c1; c < c1 + 3; ++c) { |
|
if (board[r][c] == value) return false; |
|
} |
|
} |
|
|
|
return true; |
|
} |
|
|
|
function check_board(board) { |
|
for (let r = 0; r < 9; ++r) |
|
for (let c = 0; c < 9; ++c) { |
|
let value = board[r][c] |
|
if(isNaN(value)) |
|
continue |
|
board[r][c] = NaN |
|
let res = check_cell(board,r,c, value) |
|
board[r][c] = value |
|
if(!res) |
|
return false |
|
} |
|
return true |
|
} |
|
|
|
|