- ベストアンサー
プログラミング
プログラミングの質問です。 数独(9×9)の解答判定プログラムを作っています。列、行、枠(3×3)の中に同じ数字が含まれていないことを確認すればいいことは分かったのですが、それをどう書いたらいいのか分かりません。分かる方、教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
一つの考え方として、9×9の二次元配列 int val[9][9]; を用意します。 そこで、次に (1) 3×3のなかに同じ数字がないかをチェックする関数 (2) 一列(一行)の中に同じ数字がないかをチェックする関数 を用意することになりますね で、その関数に渡す引数を工夫することになります。 3×3の矩形領域の値を取り出して、一次元配列に入れる関数 を作成すれば、引数として渡しやすいですね。 (例)行(y)と列(x)を指定したら、3×3の矩形領域の 値を指定配列に入れる関数 GetRect()を作成します。 結果を入れる配列を int rect[9]; とし、 (1)(2)の関数をそれぞれ CheckR(), CheckH(), CheckV() 関数の戻り値は、OKなら1を、No Goodなら0を返すものとします。 とすれば 3×3のチェックは、 int x, y, okR; okR = 0; for(x=0; x<9; x+=3) { for(y=0; y<9; y+=3) { GetRect(x,y); okR += CheckR(); } } 行のチェックは、 int okH; okH = 0; for(y=0; y<9; y++) { okH += CheckH(y); } 列のチェックは、 int okV; okV = 0; for(x=0; x<9; x++) { okV += CheckV(x); } これで、 if( (okR + okH + okV) == 27 ) { printf("大正解です!!\n"); } else { printf("残念、再チャレンジ!!\n"); } という具合ですね がんばって関数を仕上げてください。
その他の回答 (2)
- arain
- ベストアンサー率27% (292/1049)
>それをどう書いたらいいのか分かりません。 まず、適当な一次元配列(この場合なら数独に合わせて要素は9にした方がいいかも)を作成し、適当な数値をその配列に入れておいてください。 配列に数値が入れ終わったら、その配列内に同じ数値が存在するかどうかを確認するプログラムを組んでください。 そのプログラムが縦もしくは横のチェック用になります。 後はそれを応用して3x3用を作成します。
- noah7150
- ベストアンサー率46% (116/251)
丸投げは禁止されてますよ まずどこまで作られてるか書きましょう それに数独の判定は行、列、3x3内にのチェック以外の判定をしないと解は求められません。 どちらかと言うと消去法で判定するほうが早いです たとえば行列1,1に1が入るかを判定する時2行目3行目に1が存在する 同様に2列目3列目に1が存在すれば1,1には1しか置けませんので 多分自分で解を求める時はそれから始めると思うのですが...