4マス数独 – 入門 9マス数独 – 標準 16マス数独 – 難関
難関! 16マス数独のプログラム Javascipt
数独の解答となるパネル
一般的な9マス数独ではなく、16マス数独です。1~16の数値を割り当てます。
作成・更新をタップすれば何度でも表示されます。
選択、コピーをしてワードやエクセルに張り付けることができ、いくつかのセルの数値を消せば数独としての問題を作成できます。
数独解答作成プログラム
<p style="text-align: center;"><button onclick="generateAndDisplay()">数独の問題を作成・更新する</button></p>
<table id="sudokuSolution"><!-- ここに表示される --></table>
#sudokuSolution {
margin:auto;
width:640px;
border-collapse: collapse;
border:2px solid #111111;
}
#sudokuSolution tr:nth-child(4n) {
border-bottom:2px solid #111111;
}
#sudokuSolution td {
width: 40px;
height: 40px;
border: 1px solid black;
text-align: center;
}
#sudokuSolution td:nth-child(4n) {
border-right:2px solid #111111;
}
// 数独の解答を生成する関数
function generateSudokuSolution() {
const solution = [];
for (let i = 0; i < 16; i++) {
solution.push([]);
for (let j = 0; j < 16; j++) {
solution[i].push(0); // 一旦0で初期化
}
}
fillSudoku(solution);
return solution;
}
// 数独の解答を埋めるための再帰的な関数
function fillSudoku(solution) {
for (let row = 0; row < 16; row++) {
for (let col = 0; col < 16; col++) {
if (solution[row][col] === 0) {
const numbers = shuffleArray([1, 2, 3, 4,5,6,7,8,9,10,11,12,13,14,15,16]);
for (const num of numbers) {
if (isValidPlacement(solution, row, col, num)) {
solution[row][col] = num;
if (fillSudoku(solution)) {
return true;
}
solution[row][col] = 0; // バックトラック
}
}
return false;
}
}
}
return true; // 解答が完成した場合
}
// 数字が特定の位置に置かれることができるかをチェックする関数
function isValidPlacement(board, row, col, num) {
// 同じ列に同じ数字がないかをチェック
for (let i = 0; i < 16; i++) {
if (board[i][col] === num) {
return false;
}
}
// 同じ行に同じ数字がないかをチェック
for (let j = 0; j < 16; j++) {
if (board[row][j] === num) {
return false;
}
}
// 同じ3x3のブロック内に同じ数字がないかをチェック
const startRow = Math.floor(row / 4) * 4;
const startCol = Math.floor(col / 4) * 4;
for (let i = startRow; i < startRow + 4; i++) {
for (let j = startCol; j < startCol + 4; j++) {
if (board[i][j] === num) {
return false;
}
}
}
return true;
}
// 配列をシャッフルする関数
function shuffleArray(array) {
for (let i = array.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[array[i], array[j]] = [array[j], array[i]];
}
return array;
}
// 数独解答をHTMLに表示する関数
function displaySudokuSolution(solution) {
const table = document.getElementById('sudokuSolution');
// テーブルをクリア
table.innerHTML = '';
for (let i = 0; i < 16; i++) {
const row = document.createElement('tr');
for (let j = 0; j < 16; j++) {
const cell = document.createElement('td');
cell.textContent = solution[i][j];
row.appendChild(cell);
}
table.appendChild(row);
}
}
// 数独解答を生成して表示する関数
function generateAndDisplay() {
const sudokuSolution = generateSudokuSolution();
displaySudokuSolution(sudokuSolution);
}