かなり時間が空いてしまいましたが。
前回までの状況はこちら。
最新ソースはこちら(gitHub)。
https://github.com/takishita2nd/sudoku
さて、実際に仮置きロジックを実装していくのですが、
そのときに必要となる情報が、
仮置きロジックをどこに適用するか
ということです。
今回は、9マスのエリアの中で、一番空きマスの少ない箇所を選択するように実装してみようと思います。
private List<Square> searchKariokiSquare(Square[,] squares)
{
List<Square> ret = null;
for(int row = 0; row < 9; row += 3)
{
for(int col = 0; col < 9; col += 3)
{
List<Square> temp = new List<Square>();
for(int i = 0; i < 3; i++)
{
for(int j = 0; j < 3; j++)
{
if(squares[row + i, col + j].isConfirmed() == false)
{
temp.Add(_square[row + i, col + j]);
}
}
}
if(ret != null)
{
if(ret.Count > temp.Count && temp.Count != 0)
{
ret = temp;
}
}
else
{
ret = temp;
}
}
}
return ret;
}
コードはこんな感じに書いてみました。
9マスエリアに対して、まだ数字が入っていないマスの数を確認します。
数字が入っていないマスのオブジェクトをリストに登録し、それが他の9マスエリアの数より少ないか、を確認します。
調査結果は数字が入っていないマスのオブジェクトのリストを返します。
では、このメソッドを使用する処理を作成します。
private void doKarioki()
{
Square[,] copySquare = makeClone(_square);
List<Square> kariokiList = searchKariokiSquare(copySquare);
foreach(var s in kariokiList)
{
Console.WriteLine("[{0},{1}]", s.Row, s.Col);
}
}
仮置き処理を実行するので、処理前にマス配列のクローンを作成します。
そして、先ほどのメソッドを使用して仮置き対象のマスをリストで取得。
そして、それに対してforeachを使って仮置きロジックを適用していきます。
Windows TerminalPS E:\Source\Repos\takishita2nd\sudoku\sudoku\bin\Debug> .\sudoku.exe .\q026.txt
仮置きロジック
[0,6]
[2,6]
こんな感じで、仮置き対象のマスの抽出ができました。
うん、完成が見えてきたぞ。