4マス数独 – 入門 9マス数独 – 標準 16マス数独 – 難関
4マス数独のプログラム Javascipt
数独の解答となるパネル
一般的な9マス数独ではなく、簡単な4マス数独です。1~4の数値を割り当てます。
作成・更新をタップすれば何度でも表示されます。
選択、コピーをしてワードやエクセルに張り付けることができ、いくつかのセルの数値を消せば数独としての問題を作成できます。
数独解答作成プログラム
<button onclick="generateAndDisplay()">数独の問題を作成・更新する</button></p>
<table id="sudokuSolution"><!-- ここに表示される --></table>
#sudokuSolution {
margin:auto;
width:160px;
border-collapse: collapse;
border:2px solid #111111;
}
#sudokuSolution tr:nth-child(2n) { // 2マスごとに太線とします
border-bottom:2px solid #111111;
}
#sudokuSolution td {
width: 40px;
height: 40px;
border: 1px solid black;
text-align: center;
}
#sudokuSolution td:nth-child(2n) { // 2マスごとに太線とします
border-right:2px solid #111111;
}
// 数独の解答を生成する関数
function generateSudokuSolution() {
const solution = [];
for (let i = 0; i < 4; i++) {
solution.push([]);
for (let j = 0; j < 4; j++) {
solution[i].push(0); // 一旦0で初期化
}
}
fillSudoku(solution);
return solution;
}
// 数独の解答を埋めるための再帰的な関数
function fillSudoku(solution) {
for (let row = 0; row < 4; row++) {
for (let col = 0; col < 4; col++) {
if (solution[row][col] === 0) {
const numbers = shuffleArray([1, 2, 3, 4]);
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 < 4; i++) {
if (board[i][col] === num) {
return false;
}
}
// 同じ行に同じ数字がないかをチェック
for (let j = 0; j < 4; j++) {
if (board[row][j] === num) {
return false;
}
}
// 同じ3x3のブロック内に同じ数字がないかをチェック
const startRow = Math.floor(row / 2) * 2;
const startCol = Math.floor(col / 2) * 2;
for (let i = startRow; i < startRow + 2; i++) {
for (let j = startCol; j < startCol + 2; j++) {
if (board[i][j] === num) {
return false;
}
}
}
return true;
}