問題タブ [sudoku]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
412 参照

java - 0、1、および 2 が 0 を返すような算術演算 | 3、4、5 リターン 1 など

9x9、12x12、15x15 などの配列を取り、プログラムにそれらを複数の 3x3 正方形として解釈させようとしています。

例えば:

次のように理解されます。

どこ:

.

と を使用row % 3column % 3てボックス内の行と列の値を特定できますが、配列内の特定の値が格納されているボックスを特定するにはどうすればよいでしょうか?

この式は、以下のような方法で使用できます。

それは可能だと思われ、私はこれについて頭を悩ませてきました。簡単な問題を難しくしすぎているのではないでしょうか?

助けてくれてありがとう!

  • ユスティアン
0 投票する
6 に答える
10908 参照

java - 数独ソルバー用の GUI の構築 (ASCII の例で完成)

.

概要、サンプル

こんにちは、みんな、

ほとんどの問題をかなり迅速に解決できる基本的な数独ソルバーを作成しました。最も困難な問題を解決するためにまだ多くの作業が必要ですが、まずは基本的な JFrame GUI を実装してみたいと思います。

過去にインターネット アプレットを使用したことはありますが、JFrames を使用したことはありません。

以下の画像に似たものを作成したい(初心者向け):

.

仕様

:左パズル

  • 9x9 のセクションは明確に定義する必要があります (間に線を入れ、ボックスを分けます)
  • テキスト ボックスは数字のみを受け入れるか、1 つの数字のみを入力できるようにする必要があります (可能な場合)。

: 正しいパズル

  • 9x9 のセクションは明確に定義する必要があります (間に線を入れ、ボックスを分けます)
  • 結果を表示できる限り、ボックスを編集できるかどうかは問題ではありません

: 中央のボタン

  • [数独パズル].solve(); を実行する必要があります。

: 下部のテキスト ボックス

  • 編集可能であってはなりません

.

私が探しているもの

過去の経験から、これはすべて JFrame で実行できることはわかっていますが、自分で作成したことがないため、仕様を満たすためにどのコンポーネント(コンテンツ項目、パネル、設定など) を使用する必要があるのか​​よくわかりません。 . テキスト ボックスを数値に制限し、ユーザーが一度に複数の値を挿入できないようにする方法をまだ見つけていません。テキスト ボックスは本当に最適なオプションですか? それとも、自分のニーズにより具体的に適合するものがないのでしょうか?

必要なクラスを知る必要があるだけでなく、ボタンが 2 つのパズルの間に快適に収まり、テキスト ボックスがその下に収まるようにこれらを整理する方法も必要です。私が読んだことから、MigLayoutはこのプロセスを簡素化するためのオプションのようです。

.

エンドノート

助けてくれた人には本当に感謝しています。この質問の一部が少し失礼または唐突に見える場合は、お詫び申し上げます。私はほとんどの質問を夜に投稿する傾向があるため、すべての回答を試す前に、コミュニティが数時間かけて熟考する必要があります (それと、私がほとんどの日に何かをしているという事実もあります)。

ご質問にお答えするために、あと 1 ~ 2 時間起きています。

再びありがとう、

ユスティアン

0 投票する
1 に答える
1436 参照

sudoku - C++ の数独ジェネレーターはどこで入手できますか?

ここに 1 つ - http://ostermiller.org/qqwing/ がありますが、時々私の PHP コード (shell_exec('qqwing..')) が停止し、syslog で qqwing のセグメンテーション エラーを見つけることができます。

それで、より良いジェネレーターを探していますが、見つかりません。高速で難易度があります。

助言がありますか?

0 投票する
3 に答える
6002 参照

c# - 数独ボード作成のためのブルートフォースアルゴリズム

私が開発しているのは、最初は数独ボード全体が空であることです。ランダムなセル (81 のうち) の 1 つがランダムな値 (1-9) で埋められます。

ここで、ブルート フォース アプローチを使用して、残りのすべてのセルを埋めたいと思います。
グーグルで調べた結果、最初のセルから始めて 1 を入力し (有効な場合)、2 番目のセルに 2 を入力します (有効な場合は、最後に入力されたセル、この場合は 1 で、9 に達したら 1 でリセットします)。

問題は、それが適切に機能していないということです!

誰でも私を正確なアルゴリズムにリンクできますか。

0 投票する
3 に答える
1018 参照

c++ - 数独ソルバーが何らかの理由でスタックし続ける

そこで、高校のコンピューター プロジェクト用のプログラムを書かなければならず、sudoko ソルバーを作ろうと考えました。「解決」アルゴリズムは次のように実装されます:-

  1. 行、列、3x3 セットを見て 1 つの要素だけが「収まる」ポイントについては、その番号を入力します。これができなくなるまでこれを繰り返します。これは「singleLeft」関数で見られます。
  2. 数値が関連する行、列、または 3x3 セットのどこかに「収まる」が、他のどこにも当てはまらない場合は、その数値を入力します。これは、「checkOnlyAllowed」関数で確認できます。
  3. まだ完了していない場合は、「推測」を行います - ポイントに「適合する」数を取り、そこに入れ、このアルゴリズムを使用して再度解決します (再帰) - 機能する場合は完了です。

これまでのところ、私はこのコードを持っています:

(行番号を含むコード: http://sprunge.us/AiUc?cpp )

今ではあまり良いスタイルではないことを理解していますが、それは深夜のコーディングセッションから出てきたものであり、学校の研究室で古いコンパイラを使用しているため、いくつかのことを別の方法で行う必要がありました (そのコンパイラでは、標準ヘッダー'.h' 拡張子があり、for ループで宣言された変数は for スコープの外側にあります ... )。

ファイルには、ボードの各スポットの空白で区切られた数字が含まれている必要があります。左上から始まり、左から右、上から下に進み、空のスポットは「0」で示されます。

次のファイルの場合、かなりうまく機能します。

ただし、これは問題を引き起こします。

printステートメントをコメントアウトして進行状況を追跡すると、ポイントで間違った方向に進んでいることがわかります。最終的には最後に向かってスタックし、バックトラックが十分に戻ることはありません。「checkOnlyAllowed」部分に何か問題があると思います...

何が問題になると思いますか?

また、「mAllowed」テーブルにビットフィールドを使用できたことは知っていますが、学校ではまだビット演算について公式に知りません。:P

0 投票する
3 に答える
761 参照

programming-languages - プログラミング言語を特定する

このプログラミング言語を特定してください。

出力:

このブログのコメントでコードを見つけました。

0 投票する
3 に答える
9644 参照

java - Java問題におけるブルートフォース数独ソルバーアルゴリズム

アルゴリズムでは、solveメソッド以外はすべて正常に機能しているようです。解ける数独ボードを使ってプログラムを実行すると、解けないと言っています。私はsolveメソッドで考えられるすべてのことを試しました。デバッグを試みましたが、最初の行がテストされた後、失敗します。助言がありますか?これまでの完全なコードは次のとおりです。

} System.out.print("|"); System.out.println(); } System.out.println("+---+---+---+"); }

if (grid[r][c] == 0) { System.out.print(' '); } else { System.out.print(grid[r][c]); } } public static int getEmptyCells(int[][] grid, int[][] emptyCells) { int i = 0; int numEmptyCells = 0; for (int r = 0; r < grid.length; r++) { for (int c = 0; c < grid[r].length; c++) { if (grid[r][c] == 0) { emptyCells[i][0] = r; emptyCells[i][1] = c; numEmptyCells++; i++; } } } return numEmptyCells; }

private static boolean hasNoDuplicates(int[] digitsList) { for (int j = 0; j < digitsList.length; j++) { for (int k = j + 1; k < digitsList.length; k++) { if (digitsList[j] == digitsList[k] && digitsList[j] != 0) return false; } } return true; }

private static boolean checkCurrentRow(int[][] grid, int currentRow) {
int[] digitsList = new int[grid.length]; for (int c = 0; c < digitsList.length; c++) { digitsList[c] = grid[currentRow][c]; } if (hasNoDuplicates(digitsList)) { return true; } return false; }

private static boolean checkCurrentCol(int[][] grid, int currentCol) { int[] digitsList = new int[grid.length]; for (int i = 0; i < digitsList.length; i++) { digitsList[i] = grid[i][currentCol]; } if (hasNoDuplicates(digitsList)) { return true; } return false; }

private static boolean checkCurrentRegion(int[][] grid, int currentRow, int currentCol) {
int[] digitsList = new int[grid.length]; currentRow = (currentRow / 3) * 3; currentCol = (currentCol / 3) * 3; int i = 0; for (int r = 0; r < 3; r++) { for (int c = 0; c < 3; c++) { digitsList[i] = grid[currentRow + r][currentCol + c]; i++; } } if (hasNoDuplicates(digitsList)) { return true; } return false; }

public static boolean isConsistent(int[][] grid, int currentRow, int currentCol) { if (checkCurrentRow(grid, currentRow) && checkCurrentCol(grid, currentCol) && checkCurrentRegion(grid, currentRow, currentCol)) { return true; } return false; }

public static boolean solvePuzzle(int[][] grid, int[][] emptyCells, int numEmptyCells) { int i = 0; int j = 0; int currentCellDigit = grid[emptyCells[i][0]][emptyCells[i][1]]; while (j < numEmptyCells) { if (currentCellDigit != 9) { currentCellDigit++; grid[emptyCells[i][0]][emptyCells[i][1]] = currentCellDigit; if (isConsistent(grid, emptyCells[i][0], emptyCells[i][1])) { grid[emptyCells[i][0]][emptyCells[i][1]] = currentCellDigit; i++; j++; } else { grid[emptyCells[i][0]][emptyCells[i][1]] = currentCellDigit - 1; } } else { currentCellDigit = 0; currentCellDigit = grid[emptyCells[i][0]][emptyCells[i][1]]; i--; j--; if (j < 0) { return false; } } }

return true;
}

public static void main(String[] args) {

final int SIZE = 9; int[][] puzzle = { {0,2,9,0,0,3,0,0,5}, {5,0,7,0,0,0,0,9,0}, {6,0,0,0,0,9,4,2,0}, {3,0,2,0,0,4,0,0,0}, {0,0,5,0,3,0,7,0,0}, {0,0,0,5,0,0,6,0,2}, {0,9,8,4,0,0,0,0,3}, {0,3,0,0,0,0,1,0,6}, {2,0,0,3,0,0,9,4,0} };

int[][] grid = new int[SIZE][SIZE]; int[][] emptyCellsList = new int[SIZE*SIZE][2]; int numEmptyCells = 0;

initializeGrid(grid, puzzle); numEmptyCells = getEmptyCells(grid, emptyCellsList); System.out.println("The puzzle:"); displayGrid(puzzle); if (solvePuzzle(grid, emptyCellsList, numEmptyCells)) { System.out.println("has been solved:"); displayGrid(grid); } else { System.out.println("cannot be solved!"); } } }
0 投票する
4 に答える
7545 参照

python - 数独パズルを表現するための適切なデータ構造?

数独パズルを表現するために使用するスマートなデータ構造は何でしょうか? つまり、各「セル」に数字または空白が含まれる 9X9 の正方形です。

特別な考慮事項は次のとおりです。

  • 行、列、および 3X3 "グループで比較する機能
  • 実装の容易さ (特に Python で)
  • 効率(最重要ではない)

ピンチでは、2D 配列が機能する可能性がありますが、それはエレガントなソリューションとは言えません。より良いデータ構造があるかどうか知りたいだけです。

0 投票する
3 に答える
3968 参照

java - JFormattedTextField が正しくクリアされていません

私はこの課題をやっていて、数独を解くプログラムを作ります。SudokuTextBox のグリッドを持つパネルが JFormattedTextField を拡張しています。テキストボックスごとに1つの整数のみを受け入れるように、MaskFormatterがあります。次に、キーが解放されたときに、パネルにこのコードがあります。

問題は、テキスト ボックスに有効な値を入力すると、戻って無効な値を入力すると (数独の規則により)、テキスト ボックスがクリアされることです。しかし、次にタブで進むと、以前の有効な値がテキスト ボックスに表示されます。入力されたすべての数字を含む私の sudokumatrix は、値をクリアする必要があるため、対応するテキスト ボックスにのみ表示されます。

「SudokuTextBox extends JFormattedTextField」を「SudokuTextBox extends JTextField」に変更すると、事態がさら​​に混乱するため、魅力的に機能します。しかし、JTextField のサイズを正方形に設定することはできず、テキスト ボックスごとに 1 つの整数のみを強制することはできません。

本当に明らかな何かが欠けていますか?

0 投票する
2 に答える
1960 参照

java - 2 次元配列を使用した Java Sudoku Permuter プログラムについて教えてください。

数独の 9 つの行を 9 つの 9 桁の数字として表示し、数独に対して 6 つの操作のいずれかを実行するようにユーザーに求めるプログラムを作成する必要があります。次に、ユーザーが操作を実行するたびに数独を出力する必要があります。これは、どのように進むべきかのサンプル実行のようなものです。

ユーザーが 3 を入力したとします (2 つの行パネルを交換するため)。これが出てきます:

行パネル 1 と 3 を入れ替えると、次のようになります。

ユーザーが 5 を入力したとします。これが表示されます。

元の数独が再び出力されますが、2 と 8 が完全に入れ替わっています。

ユーザーが 1 を入力すると、次のようなメッセージが表示されます。

そして、ユーザーが入力する行に関係なく、これら 2 つの個別の行が交換され、数独が再び出力されます。ユーザーが 2 を入力した場合も同様ですが、2 つの列が切り替えられます。同様に、ユーザーが 4 を入力すると、2 つの列パネルが切り替わります。

次のような 2 次元配列を使用することになっています。

これを行う方法がわかりません。私は学期中ずっと苦労してきました。これは私の最初のプログラミングクラスです。私は配列をまったく理解していませんし、そもそも数独をどのように表示することになっているのかさえ理解していません。この問題は私たちの本にはありませんので、振り返ることもありません。私は本当にこのクラスに合格する必要があります。誰かが私を助けることができれば、本当に感謝しています。理解しやすいようにしてください。まだ方法を学んでいないことがたくさんあります (例: 記録のために、parseInt とは何かを知ります)。私はその本を読んでみました(数回)。ある程度は役に立ちますが、このプログラムは不可能になるでしょう。助けてくれてありがとう。