前回までの状況はこちら。
最新ソースはこちら。(gitHub)
https://github.com/takishita2nd/Picross
今回はここを狙います。
ここは、数値が一つなのに対して、塗るで確定しているマスが二つありますので、この間が塗れることが分かります。
これを実装します。
// 解析パターンその7
// 数字が1個で2マス塗られている場合はその間を塗る
private void pattern7()
{
// Row
pattern7Row();
// Col
pattern7Col();
}
private void pattern7Row()
{
int row = 0;
foreach (var rowlist in rowNumbers)
{
if (rowlist.IsAnalyzed())
{
row++;
continue;
}
if(rowlist.AnalyzeDatas.Count == 1)
{
int value = rowlist.AnalyzeDatas[0].Value;
int startCol = 0;
int endCol = 0;
for (int col = 0; col < colNumbers.Count; col++)
{
if(_bitmapData[row, col].IsPainted() && startCol == 0)
{
startCol = col;
}
else if(_bitmapData[row, col].IsMasked() && startCol != 0)
{
break;
}
else if(_bitmapData[row, col].IsPainted() && startCol != 0)
{
endCol = col;
}
}
if(startCol== 0 || endCol == 0)
{
row++;
continue;
}
for(int col = startCol; col < endCol; col++)
{
_bitmapData[row, col].Paint();
}
}
row++;
}
}
private void pattern7Col()
{
int col = 0;
foreach (var collist in colNumbers)
{
if (collist.IsAnalyzed())
{
col++;
continue;
}
if (collist.AnalyzeDatas.Count == 1)
{
int value = collist.AnalyzeDatas[0].Value;
int startRow = 0;
int endRow = 0;
for (int row = 0; row < rowNumbers.Count; row++)
{
if (_bitmapData[row, col].IsPainted() && startRow == 0)
{
startRow = row;
}
else if (_bitmapData[row, col].IsMasked() && startRow != 0)
{
break;
}
else if (_bitmapData[row, col].IsPainted() && startRow != 0)
{
endRow = row;
}
}
if (startRow == 0 || endRow == 0)
{
col++;
continue;
}
for (int row = startRow; row < endRow; row++)
{
_bitmapData[row, col].Paint();
}
}
col++;
}
}
やっていることは簡単で、最初に塗られているマスと後に塗られているマスを探し、その間を塗る、というロジックです。
まずは1周実行してみます。
想定通りに塗られていますね。
では2周目
3周目
おや?
ここをマスクされると、縦11の数字の処理に矛盾が発生しますので、この動きはおかしいですね。
いろいろ調査してみましたが、解析パターン5でマスクを行っている用です。
なので、今の解析パターン5に問題があるようです。
なので、次回なおしましょうか。(今なおしたらハマりそう)