- 締切済み
javaで数独を解くプログラムについて
java初心者です。 学校で数独を解けという問題が出て、問題の意味もまったくわからないのでヒントください。 問題 数独を解くプログラムを作成せよ。ただし、すでに埋まっているマスを入力する時にはi,j,n(改行)でひとつの数字を入力できるものとし、終了条件は、0,0,0を入力するとする。 問題用紙には1問だけ数独が載ってあるのですが、 初歩的な質問で申し訳ありませんが まずこのプログラムは、その1問だけ載っているマスが少し埋まっているプログラムを打ち込んでから解くプログラムを考えるのでしょうか? 普通、数独を解くプログラムとは、空いているマスにキーボード入力して、解くのでしょうか?それとも自動に動いて解くのでしょうか? はじめにプログラムをコンパイルしたときにどう言葉が出るようにすればようのでしょうか? 終了条件0,0,0とは、000を入力したら終わる?ということでしょうか? マスを作って、クリックすると数字が…というようなjavaは習ってなくコマンドプロントでコンパイルだけなので、数字を打って入力、エンターというだけで解くのだと思うのですが、まったくわからないです。 根本的にわからなくてすいません。 ぜひご回答よろしくおねがいします。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- zozy
- ベストアンサー率60% (20/33)
問題の解決策をソースコードをまじえて解説します。 なお、ソースコードは即興で書いたものなので、 とても汚いですが、勘弁ください。 一般的に数独はマスを全部埋めてから答え合わせするわけですね。 なので、i(入力したいマスの縦の位置),j(入力したいマスの横の位置), n(入力したい数字)でエンターキーでマスに数字を入れていきます。 ↓ マスの中の数字 int[][] num=new int[9][9]; 正解判定のために boolean clear=true; 9*9マスを3*3のブロックを縦に並び替え 9個分縦に並べた配列に変換したあとの配列 int[][] sort=new int[9][9]; System.out.println(変更したいマスの縦座標を入力してください); iに入力させた数字を代入 System.out.println(変更したいマスの横座標を入力してください); iに入力させた数字を代入 System.out.println(変更後の数字を入力してください); nにさせた数字を代入 num[i][j]=n; これを0,0,0と入力するまで繰り返させる(while文) そして、最後に正解の判定 boolean clear=true; //横の列の数字にかぶってるものがないか for(int i=0;i<9;i++){ for(int a=0;a<8;a++){ for(int b=a+1;b<9;b++){ //かぶってたらfalse if(num[i][a]!=num[i][b]){ clrea=false; } } } } //縦の列にかぶってる数字がないか for(int j=0;j<9;j++){ for(int a=0;a<8;a++){ for(int b=a+1;b<9;b++){ //かぶってたらfalse if(num[a][j]!=num[b][j]){ clrea=false; } } } } //配列の並び替え int count=0;//配列sortの縦座標 for(int bx=0;bx<3;bx++){ for(int by=0;by<3;by++){ for(int i=bx*3;i<bx*3+3;i++){ for(int j=by*3;j<by*3+3;j++){ sort[bx*3+by][count[i][j]; count++; } } count=0; } } } 次にsortの縦横にかぶってる数字がないか 上記のnumをsortに変えればできるのでソースコードは 省略します。 最後に結果の出力を if(clear==true){ System.out.println("正解"); }else{ System.out.println("不正解"); }
お礼
ご丁寧なご回答、本当にありがとうございます。 見本にしてやってみます!