前回までの状況はこちら。
最新ソースはこちら。(gitHub)
https://github.com/takishita2nd/Picross
次はここを処理します。
ここは数字が[3,1]とありますが、すでに3マス塗られているので、その上にある空白はマスクされるのが確定されています。
考え方は、
・数字の先頭が解析済みである。
・マスの中で塗られている該当箇所を特定する。
・その前の空白マスをマスクする。
このロジックで行けるはずです。
// 解析パターンその13
// 確実に塗れない空白部分をマスクする
private void pattern13()
{
// Row
pattern13RowFront();
pattern13RowBack();
// Col
pattern13ColFront();
pattern13ColBack();
}
private void pattern13RowFront()
{
int row = 0;
foreach (var rowlist in rowNumbers)
{
if (rowlist.IsAnalyzed())
{
row++;
continue;
}
rowlist.AnalyzeDatas.Reverse();
// 先頭の数字が解析済みであるか?
if (rowlist.AnalyzeDatas[0].IsAnalyzed() == false)
{
row++;
rowlist.AnalyzeDatas.Reverse();
continue;
}
// マスクされていない連続したマスを数える
var dataList = getSquareDataListUnMaskedRow(row);
if(dataList == null)
{
row++;
rowlist.AnalyzeDatas.Reverse();
continue;
}
// 解析済みのマスを確認する
foreach(var data in dataList)
{
bool check = false;
int count = 0;
foreach(var p in data)
{
if (p.IsPainted())
{
count++;
}
else
{
break;
}
}
if(count == rowlist.AnalyzeDatas[0].Value)
{
foreach(var data2 in dataList)
{
if (data2.Equals(data) == false)
{
foreach(var p in data2)
{
p.Mask();
}
}
else
{
break;
}
}
check = true;
}
if (check)
{
break;
}
}
rowlist.AnalyzeDatas.Reverse();
row++;
}
}
このパターンは前から確認するパターンと後ろから確認するパターン、それを行と列に対して行うようにしています。
実行結果はこうなりました。
だいぶ埋まってきましたね。