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

スポンサーリンク

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