• 締切済み

javaで数独を解くプログラムについて

java初心者です。 学校で数独を解けという問題が出て、問題の意味もまったくわからないのでヒントください。 問題 数独を解くプログラムを作成せよ。ただし、すでに埋まっているマスを入力する時にはi,j,n(改行)でひとつの数字を入力できるものとし、終了条件は、0,0,0を入力するとする。 問題用紙には1問だけ数独が載ってあるのですが、 初歩的な質問で申し訳ありませんが まずこのプログラムは、その1問だけ載っているマスが少し埋まっているプログラムを打ち込んでから解くプログラムを考えるのでしょうか? 普通、数独を解くプログラムとは、空いているマスにキーボード入力して、解くのでしょうか?それとも自動に動いて解くのでしょうか? はじめにプログラムをコンパイルしたときにどう言葉が出るようにすればようのでしょうか? 終了条件0,0,0とは、000を入力したら終わる?ということでしょうか? マスを作って、クリックすると数字が…というようなjavaは習ってなくコマンドプロントでコンパイルだけなので、数字を打って入力、エンターというだけで解くのだと思うのですが、まったくわからないです。 根本的にわからなくてすいません。 ぜひご回答よろしくおねがいします。

  • Java
  • 回答数1
  • ありがとう数2

みんなの回答

  • zozy
  • ベストアンサー率60% (20/33)
回答No.1

問題の解決策をソースコードをまじえて解説します。 なお、ソースコードは即興で書いたものなので、 とても汚いですが、勘弁ください。 一般的に数独はマスを全部埋めてから答え合わせするわけですね。 なので、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("不正解"); }

gumgumgum
質問者

お礼

ご丁寧なご回答、本当にありがとうございます。 見本にしてやってみます!

関連するQ&A

  • 数独(ナンプレ)の解き方(アルゴリズム)

    プログラミングの宿題で、Javaを使って数独を解くプログラムを作っています。雑誌などにある数独の問題を解くことはできたのですが、今回はその問題もプログラムで作ってそれを解かせようというお題になってしまいました。今のところ下のような感じになっています。 1. 乱数を使って0-80までのマス番号に1-9の数字を数個適当に入れていきます。(0が左上の角で、80が右下の角です。) 乱数でマスに数字を入れますから、同じマスに数字が入ることがありますが、それはそれでそのマスを上書きしています。さらにこの段階で、数字が同じ列または3×3マスで重なることがないようにしています。 2. それを元に各マスに入る可能性のある数字をリストアップ 3. リストアップした中で、最後に必ず1つだけ数字が残るのでそれをそのマスに入れます。 とここまではできました。しかし、乱数で適当に問題をつくったにしか過ぎないから、当然ダブってしまうところや、数字が入らないマスがあります。ですから、そういったダブるところや数字の入らないマスのために補正をしたいと思うのですが、まったくアイディアが浮かびません。どのようにしたら補正をして問題を回答できますか? アルゴリズムが少々長くてもかまいません。また、Javaのコードでの回答でなくてもかまいません。とにかく、如何の様に補正するのかを知りたいです。 下にあるのが、上の1.で作った問題です。 # 0は数字が入っていないマスを示します。 060 | 000 | 080 030 | 080 | 017 000 | 100 | 000 --------------- 800 | 000 | 903 000 | 803 | 060 000 | 096 | 500 --------------- 908 | 407 | 000 205 | 000 | 400 700 | 001 | 000

  • 数独をとくプログラム

    C初心者です。大学生です。 タイトルの通り、Cで数独を解くプログラムを考えています。 数独については http://www.nikoli.co.jp/puzzles/1/ をご参照ください。 で、数独にも難易度があり、初めからある程度数字が埋まっている(簡単な) 問題を解くプログラムは作ることが出来ました。 単純に、各マスの構造体Cellに対してsign[1],sign[2],,,,,sign[9]を定義し、 それが1なら可能性あり、0なら可能性なし、として (例えばsign2]==1,sign[5]==0ならそのマスは2になる可能性はあるが5になることはない) 丹念に各マスに対してそのマスが属するブロック、列、行を調べて最後まで1であるflagを探すようにしたのです。 しかし初めから埋まっている数字が少ないと(難しいと)そもそも回答が1通りでない、 などの理由から上記のアルゴリズムでは解くことが出来ません。 あきらかにどこかをあてずっぽに仮定する作業(バックトラック?) が必要になりそうです。 ・・・が、それをどうやって実現したらいいかで行き詰っています。 どうか知恵を貸してください。よろしくお願いいたします。。。

  • 数独かを判断するプログラム

    私が作ろうとしているプログラムは数独を解くものではなく、予めテキストファイルに書かれている横9つ縦9つ、計81個の数字の表が、数独として成り立っているかを判断するものです。 数独についてはこちらで http://ja.wikipedia.org/wiki/数独 or http://sudoku.ara3.net/rule.htm 配列をa[9][9]と用意し、テキストファイルから数字を左上から順に配列に確保していき、その表が数独かどうか判断する段階で躓いています。3×3のマスの中に1~9までの数字が1個ずつあり、かつそのマスが計9つあれば数独なので、まず最初の3×3のマスの中の数字を1~9まで確認し、それを残り8つのマスにも同様に繰り返すだけで良いと思うのですが、その方法がわからず困っています。どなたかお解かりになる方、よろしくお願いします。 例として、テキストファイルの数字の表は以下の様になっています。 1 2 3 4 5 6 7 8 9 4 5 6 7 8 9 1 2 3 7 8 9 1 2 3 4 5 6 2 3 4 5 6 7 8 9 1 5 6 7 8 9 1 2 3 4 8 9 1 2 3 4 5 6 7 3 4 5 6 7 8 9 1 2 6 7 8 9 1 2 3 4 5 9 1 2 3 4 5 6 7 8 ちなみにこの表は数独として成り立っています。

  • JAVA 別のプログラムを操作する

    JAVA初心者です。 JAVAで、例えばsample1.classを実行すると、 sample2.javaがコンパイルされる・・・。 というような、実行すると他のプログラムをコンパイル するようなプログラムはどのように書けば良いでしょうか?? ご教授お願いいたします。

  • 数独を解くプログラム

    私は、ナンプレ(数独)が好きでよく問題を解いています。 ふと、(以前少しだけC言語の勉強をしていたので)C言語でナンプレを解くプログラムを作るとしたらどんなソースになるのか気になりました。 私自身のプログラム理解のレベルがソースをかなりゆっくり読んで理解できる程度なので、プログラムにおこすことなど、とてもできません。 また、過去の質問を検索してみましたがJavaやC#のものは見つけられましたが、Cは見つけられませんでした。 面倒だとは思いますが、よろしければご教授ください。

  • 最近、数独にはまっています。

    最近、数独にはまっています。 マスに可能性のある数字を書きこみながら何とか色々チャレンジしてきたのですが、 今回ものすごい難しい問題にぶち当たりました。 最初にどこに注目して解いていけば良いのか? その手掛かりから、解いていく道筋を教えていただけませんでしょうか? 宜しくお願いします。 問題です。 5***4***9 **81*54** *3*****5* *8*3*7*1* 2*******3 *7*6*2*4* *1*****9* **72*98** 8**57***4 お願いします

  • この数独を解けますか?6

    従来の数独問題が簡単過ぎるので、 新たに「16×16」の問題を作ってみました。 ルールは従来と同様、 (1)1×16 (2)16×1 (3)4×4 のマスに、1から16の数字を重複することなく埋める。 です。 正解者には、ひとつ上の問題「25×25」の挑戦権をプレゼント! その正解者には、その上の問題「36×36」の挑戦権をプレゼント! 解答・感想等、お待ちしております。 関連質問の以下を合わせてご覧ください。 この独数を解けますか?3 http://okwave.jp/qa/q6322421.html この数独を解けますか?4 http://okwave.jp/qa/q6324308.html この数独を解けますか?5 http://okwave.jp/qa/q6328529.html

  • java  コンパイルできない

    os:WindowsXP pro jdkをインストールし メモ帳でsample.javaという名前の サンプルファイルを作り コマンドプロントで javac sample.javaと入力し コンパイルしたのですが エラー:sample.javaが読み込めません エラー 1個 と出力され、コンパイルできませんでした。 過去ログを拝見したところ、 フォルダオプションの設定で、拡張子を表示し javaファイルか確認をする ということでしたので、拡張子の表示をし、 javaのソースファイルであることは確認しました。 ただ、画面に表示されているファイルはJ#になっています。 visualbasicをインストールしているため、 javaファイルはJ#になってしまうようです。 環境変数のpathはC:\Program Files\Java\jdk1.5.0\binに設定しました。 コンパイルできるようにするために どうかご教授していただければ幸いです。 よろしくお願いします。

    • ベストアンサー
    • Java
  • Javaアプリケーション内でコンパイルはできますか?

    Javaアプリケーションから、シェルにアクセスして、Javaプログラムをコンパイルおよび実行したいのですが、できますか? 具体的には、例えば、JavaアプリケーションのメインフレームにJavaプログラムを記述するテキストエリアがあってユーザはそこにJavaプログラムを記述し、任意の名前で保存できるとします。また、メインフレームには、コマンドを実行するテキストフィールドがあり、ユーザは保存したプログラムをそこからコンパイルできる。つまり、そのテキストフィールドに、 javac xxxxx.java と入力するとコンパイルでき、 java xxxxx とすると実行できる。 このようなことをしてみたいのですが、JavaアプリケーションからWindowsもしくはUNIXのシェルと連携させることはできますでしょうか?ご存知の方よろしくお願いします。

    • ベストアンサー
    • Java
  • javaのプログラムで間違い箇所が分からない。

    <<Javaサンプルプログラム集:共立出版(株)という 書籍でjavaの勉強をしています。 付属のCD-ROMのサンプルプログラムコンパイルはできるのですが、アプレット起動出来ません。 何故なんでしょう??

    • ベストアンサー
    • Java

専門家に質問してみよう