4マス数独の問題をランダムに作成 ワードやエクセルに貼り付けできる Javascript

スポンサーリンク

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;
}