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

C言語のプログラムをJavaに変換しようと思っているのですが、上手くいきません。
下記のプログラムを実行すると、一発で数独の解答が出来上がるようになっています。
Javaにはgotoがないので、そこをどのように変えたらいいのかで迷っています。
どう直したら良いのでしょうか。

#include<stdio.h>
#include<stdlib.h>
#include <time.h>

int main(void)
{
int i,j,k,l,chk=0,num=0,tmp,count=0;
int a[9][9];
srand((unsigned) time(NULL));
start:
count=0;
for(i = 0; i < 9; i++)
for(j = 0; j < 9; j++)
a[i][j]=0;
for(tmp=1;tmp<10;tmp++){
num=0;
while(num<9){
i = rand() % 9;
j = rand() % 9;
chk=0;
for(k=0;k<9;k++)
if(a[i][k]==tmp)chk=1;
for(k=0;k<9;k++)
if(a[k][j]==tmp)chk=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)chk=1;
}
}
if((chk==0)&&(a[i][j]==0)){
a[i][j]=tmp;
num++;
}
if(count%100==99){
count++;
for(i = 0; i < 9; i++)
for(j = 0; j < 9; j++)
if(a[i][j]==tmp)a[i][j]=0;
num=0;
}
if(count>10000) goto start;
count++;
}
}
for(i = 0; i < 9; i++){
for(j = 0; j < 9; j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
return 0;
}

A 回答 (3件)

int main(void)


{
int i,j,k,l,chk=0,num=0,tmp,count=0;
int a[9][9];
srand((unsigned) time(NULL));
for (;;){
count=0;
for(i = 0; i < 9; i++)
for(j = 0; j < 9; j++)
a[i][j]=0;
for(tmp=1;tmp<10;tmp++){
num=0;
while(num<9){
i = rand() % 9;
j = rand() % 9;
chk=0;
for(k=0;k<9;k++)
if(a[i][k]==tmp)chk=1;
for(k=0;k<9;k++)
if(a[k][j]==tmp)chk=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)chk=1;
}
}
if((chk==0)&&(a[i][j]==0)){
a[i][j]=tmp;
num++;
}
if(count%100==99){
count++;
for(i = 0; i < 9; i++)
for(j = 0; j < 9; j++)
if(a[i][j]==tmp)a[i][j]=0;
num=0;
}
if(count>10000) break;
count++;
}
if(count>10000) break;
}
if(count<=10000) break;
}
for(i = 0; i < 9; i++){
for(j = 0; j < 9; j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
return 0;
}

この回答への補足

補足じゃなく質問なので申し訳ないのですが、これをJavaに書き換えるとどうなりますか?

補足日時:2011/02/07 20:48
    • good
    • 0
この回答へのお礼

ありがとうございます!
参考にさせていただきます!!

お礼日時:2011/02/07 19:45

C/C++にもありますが、


do {
  文(複数可)
} while (式);
構文を使えばいいと思います。
乱数の作成はここのあたりを参考に
http://d.hatena.ne.jp/fumokmm/20090116/1232120896
    • good
    • 0
この回答へのお礼

ありがとうございます!
やってみたいと思います!!

お礼日時:2011/02/07 20:49

ざっと読んだ感じ、数独を解くのではなく、数独の条件を満す数字列を探すののようですが。


しかも、(疑似)乱数でやっているので、最悪「見付からないままプログラムが止らない」という。


さて。
あなたの目的は何でしょう。

・Javaのプログラミングの技術向上
→ これを解析して、プログラムの流れを掴んで、同じことをする別の制御構造を考えるのがよいでしょう。
フローチャートも役に立つのでは無いでしょうか。
考え方としては、 startからが1つの大きなループと考え、 startへ戻る→continueで次のループへ / startへ戻らない→ループ終了 とするとヒントになるかも。

ただ、元があんまりよいプログラムじゃないので、実践でどこまで役立つか....↓のようなものを探した方が、Javaとしてきれいで効率のよいものが見付かる気がします。

・Javaで数独を解きたい
→このプログラムでは無理かも。
探せばJavaで解法アルゴリズムを実装しているのも見つかるでしょう。

・とにかく数独を解きたい
→ 専用のプログラムを開発している人達がいます。それを探すのが早いと思います。
    • good
    • 0
この回答へのお礼

ありがとうございます!
もう一度プログラムの流れを確認してみます!!

お礼日時:2011/02/07 20:49

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