プロが教えるわが家の防犯対策術!

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件)

そもそも、作成されたプログラムで出力したものに、解はあるのでしょうか。




> その自動解法プログラムは新しく作らなければいけないのでしょうか

ご自分で作るしかないでしょう。


また、何度も何度も同じプログラムを掲載するのはいかがなものかと思います。
    • good
    • 0

ANo.1さん:


>作成されたプログラムで出力したものに、解はあるのでしょうか。

最初に解の盤面を作ってから一部の数字を0にしているので、その盤面作成の段階で間違っていない限り解はあります。
0を30個入れた時点で既に2つ以上の解が存在しているかもしれませんが。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!