質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Q&A

解決済

4回答

5805閲覧

Java 数独のソースコード

anpan___

総合スコア28

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

0グッド

0クリップ

投稿2019/07/23 04:12

現在、Javaで数独のコーディングを行なっています。
自分の中では、ひと段落ついたと思って、実行してみると、回答前の状況が表示されるのみで、解答後の表示がない状態です…。
また、eclipseを用いているのですが、実行時のエラーコードも表示されずで問題点がわからないお状態になってしまっています。

何度見直しても、わからなく、困っておりますので、ご教授いただけないでしょうか?
また、他にこうした方がいいよ、ということがあれば、そちらもご教授いただけますと幸いです。

Java

1public class sudoku { 2 public static void solve(int[][]data) { 3 boolean tf = false; 4 do { 5 for(int r = 0; r < 9; r++) 6 for(int c = 0; c < 9; c++) { 7 int[] num = {0,0,0,0,0,0,0,0,0}; 8 if(data[r][c] == 0) { 9 int count = 0; 10 int renew = 0; 11 int sr = r / 3; 12 int sc = c / 3; 13 for(int a = 0; a < 9; a++) { 14 if(data[r][a] != 0) 15 num[data[r][a] -1] = 1; 16 } 17 for(int a = 0; a < 9; a++) { 18 if(data[a][c] != 0) 19 num[data[a][c] -1] = 1; 20 } 21 for(int s = 3 * sr; s < 3 * sr + 3; s++) { 22 for(int b = 3 * sc; b < 3 * sc + 3; b++) { 23 if(data[s][b] != 0) 24 num[data[s][b] -1] = 1; 25 } 26 } 27 for(int a = 0; a < 9 ; a++) { 28 if(num[a] == 1) 29 count++; 30 else if(num[a] == 0) 31 renew = a + 1; 32 } 33 if(count == 8) { 34 data[r][c] = renew; 35 } 36 } 37 } 38 int count = 0; 39 for(int r = 0; r < 9; r++) 40 for(int c = 0; c < 9; c++) { 41 if(data[r][c] != 0) 42 count++; 43 } 44 if(count == 81) 45 tf = true; 46 } while(!(tf)); 47 } 48 49 public static void print(int[][] data) { 50 for(int i = 0; i < 9; i++) { 51 for(int j = 0; j < 9; j++) { 52 if(data[i][j] != 0) { 53 System.out.print(" " + data[i][j] + " "); 54 } else { 55 System.out.print("( )"); 56 } 57 } 58 System.out.println(); 59 } 60 } 61 62 public static void main(String[] args) { 63 int[][] data = { 64 {0,0,0,0,0,3,0,0,1}, 65 {7,5,3,0,1,0,2,0,0}, 66 {1,0,0,6,0,0,3,7,0}, 67 {9,0,0,0,7,5,0,0,0}, 68 {0,0,0,0,0,0,0,3,7}, 69 {0,0,0,8,0,0,6,0,0}, 70 {2,9,0,0,3,0,4,0,0}, 71 {0,0,7,1,0,4,0,6,0}, 72 {0,4,0,0,9,0,0,5,0}}; 73 print(data); 74 System.out.println("---------------------------"); 75 solve(data); 76 print(data); 77 } 78}
( )( )( )( )( ) 3 ( )( ) 1 7 5 3 ( ) 1 ( ) 2 ( )( ) 1 ( )( ) 6 ( )( ) 3 7 ( ) 9 ( )( )( ) 7 5 ( )( )( ) ( )( )( )( )( )( )( ) 3 7 ( )( )( ) 8 ( )( ) 6 ( )( ) 2 9 ( )( ) 3 ( ) 4 ( )( ) ( )( ) 7 1 ( ) 4 ( ) 6 ( ) ( ) 4 ( )( ) 9 ( )( ) 5 ( ) --------------------------- //こちらにsolve実行結果が表記されない状態です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuzzball

2019/07/23 04:29

ログはPlain textにした方が見やすいかと。 ```text で出来ます。
anpan___

2019/07/23 04:49

ご指摘ありがとうございます!機能を理解しきっていなかったので助かりました。
guest

回答4

0

ざっと見た感じ、この問題をこのアルゴリズムでは解けないのではないでしょうか?

コードを見ると、解き方として「あるマスを含む縦列、横列、3×3のブロックに8種類の数字があれば、そのマスには残りの数字が入る」という考え方のようですが、それだけではマスは埋まらないのではないでしょうか?

投稿2019/07/23 04:53

swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

anpan___

2019/07/23 05:33

はい!そういう考えになっています。 確かに全く埋まらない部分も出てきますね… ご指摘ありがとうございました。 一度どういったアルゴリズムがいいのか考えない押します…!
anpan___

2019/07/23 05:55

記載いただいたURLひらけないようです!
swordone

2019/07/23 06:04

最後のカッコ閉じを消すといいのでは。
guest

0

ベストアンサー

他にこうした方がいいよ、ということがあれば

全部のマスが埋まったらループを抜けるのは当然ですが, ループしても全く進展しなかった(一度もdata[][]を更新しなかった)場合もループを抜けて「これ以上解けません」的な表示と共に結果を表示するようにされますと, アルゴリズムの修正に役立つかと思います.

投稿2019/07/23 12:44

jimbe

総合スコア12646

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

anpan___

2019/07/25 00:07

抜け出すタイミングを理解すれば、次に必要なメソッドをどこに追加するかあきらかになりました! ここから、背理法も用いて、すべての数独に対応できるものを目指します! ありがとうございました。
guest

0

ご丁寧にJavaで数独を解くプログラムを公開しているページを見つけましたので、参考にして下さい。

投稿2019/07/23 04:45

stdio

総合スコア3307

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Eclipseを使ってるなら、デバッグ機能を使いましょう。
2つ目のprint関数のところにブレークポイントを設定(コードの左側をダブルクリック)し、走らせてみて、引数がどんな値になってるか見てみればどうでしょう

投稿2019/07/23 04:31

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問