前回までの状況はこちら。
最新ソースはこちら(gitHub)
https://github.com/takishita2nd/sudoku
さて、いよいよ仮置きロジックの実装にとりかかります。
そのためには、仮置きロジックを行う条件を考えましょう。
現在まで実装しているロジックでのみで、ある程度はマスを埋めることができますので、そのロジックでも埋まらなかった場合、と考えるのが妥当でしょう。
その条件とは、周期処理の前と後で、確定しているマスの数が同じならば、と判断するのが一番簡単だと思います。
それでは実装します。
まずは、確定しているマスを数えるメソッドを作成します。
private int countInputedNumber()
{
int ret = 0;
for(int i = 0; i < 9; i++)
{
for(int j = 0; j < 9; j++)
{
if(_square[i, j].isConfirmed())
{
ret++;
}
}
}
return ret;
}
特に難しいところはありませんね。
これを、周期処理に組み込みます。
private int now_count = 0;
private int prev_coount = 0;
public void run()
{
bool roop = true;
while (roop)
{
for(int row = 0; row < 9; row++)
{
for(int col = 0; col < 9; col++)
{
if(_square[row,col].isConfirmed() == false)
{
Candidate candidate = new Candidate();
searchRowLine(row, candidate);
searchColLine(col, candidate);
search9Area(row, col, candidate);
_square[row, col].checkCandidate(candidate);
}
}
}
searchNumber();
prev_coount = now_count;
now_count = countInputedNumber();
if(prev_coount == now_count)
{
//debug
Console.WriteLine("ここで仮置きロジックを適用する {0} {1}", prev_coount, now_count);
return;
}
roop = !checkEnd();
FileAccess.Output(_square);
}
}
こんな感じでどうでしょうか。
prev_coountが周期前の確定したマス数、now_countが周期後の確定したマス数です。
確定したマス数を数える前に前回のマス数を保存し、それと、現周期でのマス数を比較します。
これが同じならば、仮置きロジックを適用する(debug出力を行っているところ)という動きになります。
次回は、このdebugの箇所を考えていきます。
「【C#】【数独】仮置きロジックを適用する条件を考える。」への2件のフィードバック