Javaで次のようなプログラムを作りました。
次に、ここから実行で得られた数独を自動解法プログラムによって、解が「1つ or 複数」かを調べるようにしたいのですが、その自動解法プログラムは新しく作らなければいけないのでしょうか。
import java.util.Random;
public class NumberPlace {
public static void main(String[] args) {
int i, j, k, l, m, n, check=0, count=0, tmp;
int a[][] = new int [9][9];
Random rnd = new Random();
int ran;
Random rnd1 = new Random();
int ran1;
Random rnd2 = new Random();
int ran2;
boolean A=false;
while(A==false){
A=true;
for ( i=0; i<9; i++ )
for ( j=0; j<9; j++ )
a[i][j] = 0;
count = 0;
for ( i=0; i<9; i++ ) {
for ( j=0; j<9; j++ ) {
ran = rnd.nextInt(9);
tmp = ran + 1;
check = 0;
//System.out.println(tmp);
for ( k=0; k<j; k++ ) //横列に入る数字をチェック
if ( a[i][k] == tmp )
check = 1;
for ( k=0; k<i; k++ ) //縦列に入る数字をチェック
if ( a[k][j] == tmp )
check = 1;
for ( k=(i/3)*3; k<(i/3)*3+3; k++ ) //ボックスに入る数字をチェック
for ( l=(j/3)*3; l<(j/3)*3+3; l++ )
if ( a[k][l] == tmp )
check = 1;
if ( check == 0 )
a[i][j] = tmp;
if ( check == 1 )
j--;
if ( count > 50000 ){
A=false;break;}
count++;
}
count = 0;
}
}
for ( i=0; i<30; i++ ) { //0を入れる回数
ran1 = rnd1.nextInt(9);
m = ran1;
ran2 = rnd2.nextInt(9);
n = ran2;
if ( a[m][n] == 0 ) { //0にしようとした場所が既に0だったら直前に戻る
i--;
}
a[m][n] = 0;
}
for ( i=0; i<9; i++) {
for ( j=0; j<9; j++ ) {
if ( a[i][j] < 10 ) {
System.out.print(" ");
}
System.out.print(a[i][j]);
}
System.out.print("\n");
}
}
}
これを(最初に入れる0の数を30個として)実行すると、次のようになります。
0 7 6 9 4 1 8 2 5
2 0 5 3 7 0 9 4 0
9 0 4 8 2 5 0 3 7
1 0 2 0 0 0 5 0 6
6 9 3 1 0 0 0 8 2
7 0 8 0 0 0 0 1 4
0 0 0 0 0 0 0 0 3
4 3 0 5 6 8 2 7 9
5 2 9 4 3 7 0 0 8
皆さんの回答の程宜しくお願いします。
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
そもそも、作成されたプログラムで出力したものに、解はあるのでしょうか。
> その自動解法プログラムは新しく作らなければいけないのでしょうか
ご自分で作るしかないでしょう。
また、何度も何度も同じプログラムを掲載するのはいかがなものかと思います。
No.2
- 回答日時:
ANo.1さん:
>作成されたプログラムで出力したものに、解はあるのでしょうか。
最初に解の盤面を作ってから一部の数字を0にしているので、その盤面作成の段階で間違っていない限り解はあります。
0を30個入れた時点で既に2つ以上の解が存在しているかもしれませんが。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- Ruby vscode 文字化け 1 2022/05/21 19:17
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- FX・外国為替取引 mql4のコンパイルエラー箇所の修正お願いします。 1 2023/03/15 16:14
- C言語・C++・C# C言語 3 2022/11/09 13:27
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ループ処理の際、最後だけ","を...
-
java キーボード入力された値の...
-
論理演算子”||”またはの入力方法
-
*を表示させるプログラムを
-
数値⇒漢数字変換 java
-
Randomメソッドの確率設定
-
java 配列
-
Java、2の0乗~10乗の表示
-
画面出力の際の繰り返しと入力...
-
JSPのwhile文で1~5の☆でひし形...
-
java 拡張for map
-
繰り返しによる星印の出力
-
要素数が10の配列で、乱数0~9...
-
Java 入力した整数値の合計を、...
-
7つ数字を表示したら改行すると...
-
乱数の生成について
-
Loop後に変数が出力できないです
-
for文を使った累乗の計算方法に...
-
テキストボックスに入力された...
-
java プログラム for 文 while ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ループ処理の際、最後だけ","を...
-
java キーボード入力された値の...
-
Java、2の0乗~10乗の表示
-
数値⇒漢数字変換 java
-
論理演算子”||”またはの入力方法
-
コマンドライン引数の例外処理...
-
JAVAのfor文で困っています。
-
続・ZZZ,ZZZ,ZZ9形式の金額形式...
-
Java 入力した整数値の合計を、...
-
7つ数字を表示したら改行すると...
-
テキストボックスに入力された...
-
countに実行した回数をいれたい...
-
総称型ArrayList<E>への参照...
-
Randomメソッドの確率設定
-
Ctrl+Zが入力されると終了する...
-
学校で課題を出されて困ってい...
-
Java キーボードから負の数が入...
-
キーボードから10人分の点数を...
-
階乗の式
-
Java 配列<選挙>
おすすめ情報