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;
}
No.1ベストアンサー
- 回答日時:
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;
}
No.2
- 回答日時:
C/C++にもありますが、
do {
文(複数可)
} while (式);
構文を使えばいいと思います。
乱数の作成はここのあたりを参考に
http://d.hatena.ne.jp/fumokmm/20090116/1232120896
No.3
- 回答日時:
ざっと読んだ感じ、数独を解くのではなく、数独の条件を満す数字列を探すののようですが。
しかも、(疑似)乱数でやっているので、最悪「見付からないままプログラムが止らない」という。
さて。
あなたの目的は何でしょう。
・Javaのプログラミングの技術向上
→ これを解析して、プログラムの流れを掴んで、同じことをする別の制御構造を考えるのがよいでしょう。
フローチャートも役に立つのでは無いでしょうか。
考え方としては、 startからが1つの大きなループと考え、 startへ戻る→continueで次のループへ / startへ戻らない→ループ終了 とするとヒントになるかも。
ただ、元があんまりよいプログラムじゃないので、実践でどこまで役立つか....↓のようなものを探した方が、Javaとしてきれいで効率のよいものが見付かる気がします。
・Javaで数独を解きたい
→このプログラムでは無理かも。
探せばJavaで解法アルゴリズムを実装しているのも見つかるでしょう。
・とにかく数独を解きたい
→ 専用のプログラムを開発している人達がいます。それを探すのが早いと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# C言語でif文が予想と違う動きをする件について7 4 2023/03/20 00:26
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# LU分解法のピボッティングについて(C言語/gcc-9) 3 2022/07/11 23:10
- C言語・C++・C# C言語 3 2022/11/09 13:27
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ループ処理の際、最後だけ","を...
-
テキストボックスに入力された...
-
論理演算子”||”またはの入力方法
-
Loop後に変数が出力できないです
-
基数変換プログラム
-
javaプログラムについて
-
Java、2の0乗~10乗の表示
-
繰り返しによる星印の出力
-
for文を使った累乗の計算方法に...
-
Randomメソッドの確率設定
-
数値⇒漢数字変換 java
-
Java 配列<選挙>
-
Ctrl+Zが入力されると終了する...
-
java キーボード入力された値の...
-
階乗の式
-
VBAで配列の計算
-
配列にnullを代入すると、null...
-
配列をセッションに割り当てた後で
-
1~100までの数字を表示し、か...
-
Log4jで機能毎に別ファイルへ出...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ループ処理の際、最後だけ","を...
-
java キーボード入力された値の...
-
Java、2の0乗~10乗の表示
-
数値⇒漢数字変換 java
-
論理演算子”||”またはの入力方法
-
コマンドライン引数の例外処理...
-
JAVAのfor文で困っています。
-
続・ZZZ,ZZZ,ZZ9形式の金額形式...
-
Java 入力した整数値の合計を、...
-
7つ数字を表示したら改行すると...
-
テキストボックスに入力された...
-
countに実行した回数をいれたい...
-
総称型ArrayList<E>への参照...
-
Randomメソッドの確率設定
-
Ctrl+Zが入力されると終了する...
-
学校で課題を出されて困ってい...
-
Java キーボードから負の数が入...
-
キーボードから10人分の点数を...
-
階乗の式
-
Java 配列<選挙>
おすすめ情報