今回はJavaで数独に使われる9×9の魔方陣をランダムに出力するプログラムを作成してみます。
数独魔方陣の特徴
作成する数独の9×9の魔方陣の特徴についてまとめます。
数独の魔方陣の特徴- 縦と横の全ての列で1~9の数字が1つずつ使われる
- 3×3のブロックに1~9の数字が1つずつ使われる
数独の魔方陣はこんな感じの数表です。
$$
\large\begin{array}{|c|c|c|c|c|c|c|c|c|}
\hline
7 & 2 & 9 & 3 & 6 & 4 & 1 & 5 & 8 \\
\hline
6 & 1 & 5 & 9 & 2 & 8 & 3 & 7 & 4 \\
\hline
3 & 4 & 8 & 7 & 1 & 5 & 6 & 2 & 9 \\
\hline
4 & 9 & 3 & 2 & 8 & 1 & 7 & 6 & 5 \\
\hline
8 & 6 & 1 & 5 & 9 & 7 & 4 & 3 & 2 \\
\hline
2 & 5 & 7 & 4 & 3 & 6 & 9 & 8 & 1 \\
\hline
1 & 7 & 2 & 8 & 4 & 3 & 5 & 9 & 6 \\
\hline
9 & 3 & 6 & 1 & 5 & 2 & 8 & 4 & 7 \\
\hline
5 & 8 & 4 & 6 & 7 & 9 & 2 & 1 & 3 \\
\hline
\end{array}
$$
プログラミングで作ってみる
上の画像のような数表をランダムで出力するプログラムを作成します。
基本的な作り方のアルゴリズムは以下の通りです。重複のチェックはHashSetを使いました。
アルゴリズム- 出来上がった数表を格納する配列
array
を宣言する - 1~9の数字が入った
ArrayList
を作りシャッフルし、array
に格納する(これが横の行の1つになる) - 縦の列に重複しないように
ArrayList
をarray
に格納していく 重複したら格納せずもう一度シャッフルしていくを繰り返す - 同時に3×3のブロックも重複がないかチェックする 重複したらその都度やり直す
サンプルコードを以下に示します。
条件を満たす数表が出力されました。条件を満たすまでシャッフルを繰り返すので、出力されるまでちょっと時間がかかります。
今回は数独の数表を作るところまで完成しました。
完全にランダムで条件を満たすか当てはめていってるので、処理に時間がかかっているところが問題点ですね。その部分を処理を減らすことも考えていきたいです。
この記事では時間がなくてできませんでしたが、数独の問題を作る機能も実装したいと思います。以上で記事を終わりにします。
関連記事