前回までの状況はこちら。
最新ソースはこちら(gitHub)
https://github.com/takishita2nd/sudoku
前回のソースでは、以下のような問題で解析が途中で失敗していました。
この原因を探るため、ログ出力を強化します。
まず、マスに値を入れるタイミングでログを出します。
次に、仮置きロジックを適用する時と、仮置き前に巻き戻しをする時に、それが分かるようにログを出します。
さらに、仮置きロジックを適用する場所をログに出力するようにします。
ここまでやって、 仮置きロジックを適用する場所を探す処理に不具合がある事が分かりました。
/**
* 仮置き対象のマスを抽出する
*
* squares マス
*/
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;
}
★の箇所で、ret=nullで、temp.Count = 0の時に、仮置きロジックを適用する箇所がない(ret.Count=0)となり、解析が終了していることが分かりました。
なので、★の箇所を修正します。
if (ret != null)
{
if (ret.Count > temp.Count && temp.Count != 0)
{
ret = temp;
}
}
else if(temp.Count != 0)
{
ret = temp;
}
解けました。
難易度★5の問題も解けるようになったので、大抵の問題は解けるようになりました。
もう少し動かしてみます。