Перейти к основному содержимому
claw
am
tools
Инструменты
Документы
Daoark
EN
Главная
Главная
/
Развлечения и мистика
›
Главная
manifest.json
>> 0) / 4294967296); }; } function shuffle(arr, rng) { for (var i = arr.length - 1; i > 0; i--) { var j = Math.floor(rng() * (i + 1)); var t = arr[i]; arr[i] = arr[j]; arr[j] = t; } return arr; } function isValid(board, r, c, n) { for (var i = 0; i < 9; i++) if (board[r][i] === n) return false; for (var i = 0; i < 9; i++) if (board[i][c] === n) return false; var br = Math.floor(r / 3) * 3, bc = Math.floor(c / 3) * 3; for (var i = 0; i < 3; i++) for (var j = 0; j < 3; j++) if (board[br + i][bc + j] === n) return false; return true; } function solve(board, rng) { for (var r = 0; r < 9; r++) for (var c = 0; c < 9; c++) { if (board[r][c] === 0) { var nums = shuffle([1, 2, 3, 4, 5, 6, 7, 8, 9], rng); for (var k = 0; k < 9; k++) { if (isValid(board, r, c, nums[k])) { board[r][c] = nums[k]; if (solve(board, rng)) return true; board[r][c] = 0; } } return false; } } return true; } function generateFull(rng) { var board = []; for (var i = 0; i < 9; i++) board.push([0,0,0,0,0,0,0,0,0]); solve(board, rng); return board; } function countSolutions(board, cap) { var count = 0; function bt() { for (var r = 0; r < 9; r++) for (var c = 0; c < 9; c++) { if (board[r][c] === 0) { for (var n = 1; n <= 9; n++) { if (isValid(board, r, c, n)) { board[r][c] = n; bt(); board[r][c] = 0; if (count >= cap) return; } } return; } } count++; } bt(); return count; } function digHoles(solution, holes, rng) { var puzzle = solution.map(function(r) { return r.slice(); }); var positions = []; for (var i = 0; i < 81; i++) positions.push(i); shuffle(positions, rng); var dug = 0; for (var i = 0; i < positions.length && dug < holes; i++) { var pos = positions[i]; var r = Math.floor(pos / 9), c = pos % 9; var saved = puzzle[r][c]; puzzle[r][c] = 0; if (countSolutions(puzzle, 2) === 1) dug++; else puzzle[r][c] = saved; } return puzzle; } function escape(s) { return String(s).replace(/[&<>"']/g, function(c) { return {'&':'&','<':'<','>':'>','"':'"',"'":'''}[c]; }); } function renderBoard(board) { var html = '
'; for (var r = 0; r < 9; r++) { html += '
'; for (var c = 0; c < 9; c++) { var v = board[r][c]; var borderT = r % 3 === 0 ? '3px' : '1px'; var borderL = c % 3 === 0 ? '3px' : '1px'; var borderR = c === 8 ? '3px' : (c % 3 === 2 ? '2px' : '1px'); var borderB = r === 8 ? '3px' : (r % 3 === 2 ? '2px' : '1px'); var style = 'border-top:' + borderT + ' solid #333;border-left:' + borderL + ' solid #333;border-right:' + borderR + ' solid #333;border-bottom:' + borderB + ' solid #333;width:36px;height:36px;text-align:center;'; style += v === 0 ? 'color:#999;' : 'color:#222;font-weight:bold;'; html += '
' + (v === 0 ? '·' : v) + '
'; } html += '
'; } html += '
'; return html; } function boardToText(board) { var lines = []; for (var i = 0; i < 9; i++) lines.push(board[i].map(function(v) { return v === 0 ? '.' : v; }).join(' ')); return lines.join('\n'); } function doProcess() { try { var diff = parseInt(getVal('difficulty'), 10); var seed = getVal('seed'); var rng = makeRng(seed); var sol = generateFull(rng); var puzzle = digHoles(sol, diff, rng); var html = renderBoard(puzzle) + '
解:
' + renderBoard(sol); showResult(html, '难度(挖洞 ' + diff + '), 种子: ' + (seed || '随机') + '\n题目:\n' + boardToText(puzzle) + '\n解:\n' + boardToText(sol)); } catch (e) { showError('生成失败: ' + (e.message || e)); } } $('btn-main').addEventListener('click', function(e) { e.preventDefault(); doProcess(); }); $('btn-clear').addEventListener('click', function() { var inputs = document.querySelectorAll('input,textarea,select'); for (var i = 0; i < inputs.length; i++) { if (inputs[i].tagName === 'SELECT') inputs[i].selectedIndex = 0; else inputs[i].value = inputs[i].defaultValue; } var ra = $('result-area'); ra.hidden = true; ra.style.display = 'none'; var em = $('error-msg'); em.hidden = true; em.style.display = 'none'; }); })();